Premiers tours de Pure_moulinette v0.0 !
Publié : lun. 06/nov./2006 22:51
OBJECTIF : est de voir rapidemment la structure d'un programme.
La moulinette récolte les commentaires principaux et détecte les procédures ainsi lque les liens qui existent entre-elles.
Chaque zone du programme est repérée par ses numéros de lignes
PRINCIPE: avec la fonctions de STRING, je récupère tous les infos sur les procédures, puis je scanne le programme principal pour voir de quelle manière elles interviennent.
EXEMPLE: programme passé à la moulinette
RESULTAT:(aucun icône n'est actif pour le moment

La moulinette récolte les commentaires principaux et détecte les procédures ainsi lque les liens qui existent entre-elles.
Chaque zone du programme est repérée par ses numéros de lignes
PRINCIPE: avec la fonctions de STRING, je récupère tous les infos sur les procédures, puis je scanne le programme principal pour voir de quelle manière elles interviennent.
EXEMPLE: programme passé à la moulinette
Code : Tout sélectionner
Procedure p3()
EndProcedure
Procedure p4()
EndProcedure
Procedure p5()
EndProcedure
Procedure p2()
p3()
p4()
p5()
EndProcedure
Declare p6()
Procedure p1()
p2()
EndProcedure
Procedure p6()
p2()
p3()
p1()
EndProcedure
;programme principal
;action 1
;action 2
p1()
;action 3
;action 5
p6()
p2()
;action 6
Code : Tout sélectionner
;**********************************
Enumeration
#spr_icones
#spr_code_var
#spr_arbre
#spr_fermer
#spr_souris
#spr_panorama
#spr_bloc
#spr_sprite_final
EndEnumeration
#Longueur=128 ;longueur d'un bloc
#hbloc=18; hauteur d'un bloc
;**********************
Structure infos
nom.s
enfant.l
nom_enfant.s
ligne_debut_code.l
ligne_fin_code.l
occupe.b
visible.b
origine.s
descendance.s
decalage_y.d
delta.d ;grandeur de reference pour dessiner les branches
EndStructure
;variables**********************
ligne.l=0
ligne_max.l=0
compteur_procedure.l=0
arret_comptage.b=0
branche.l=0
generation.l=0
Global noeud.l, compteur_procedure_max.l,generation_max.l,enfant_max.l,noeud_max.l
Global Largeur.l,Hauteur.l,delta.l,branche_max.l
delta=#hbloc+1;ecart minimal entre deux blocs
Largeur=48;dimensions du sprite qui sera "clipper" pour faire les icones 16*16
Hauteur=32
;tableau********************************
Global Dim tableau(Largeur-1, Hauteur-1)
Global Dim info_procedure.infos(100); info_procedure.infos(compteur_procedure)
Global Dim bloc.infos(20,300,100);bloc.infos(generation,noeud,branche)
Global Dim memo_generation.l(20,300,100)
Global Dim memo_noeud.l(20,300,100)
Global Dim memo_branche.l(20,300,100)
;procedures************************
Procedure.l initialisation()
For i=1 To generation_max
For j=1 To noeud_max
For k=1 To enfant_max
bloc(i,j,k)\enfant=0
bloc(i,j,k)\nom=""
bloc(i,j,k)\nom_enfant=""
Next k
Next j
Next i
For i=1 To generation_max
For j=1 To noeud_max
bloc(i,j,0)\occupe=0
Next j
Next i
EndProcedure
Procedure dessin_icones()
CreateSprite(#spr_icones, Largeur, Hauteur,0)
StartDrawing(SpriteOutput(#spr_icones))
; mise en tableau ************
For i = 0 To Largeur -1
For j = 0 To Hauteur -1
Read donnees.l
tableau(i, j)=donnees.l
Next j
Next i
; dessin point par point**************************
For i = 0 To Largeur -1
For j = 0 To Hauteur -1
Plot(i,j,tableau(i,j))
Next j
Next i
StopDrawing()
EndProcedure
Procedure dessin(nom.b,x.b,y.b,w.b,h.b)
CopySprite(#spr_icones,nom,0)
ClipSprite(nom,x,y,w,h)
EndProcedure
Procedure.l detection_enfant(detect_gen.l,detect_noeud.l,detect_branche.l)
;variables de mémorisation des blocs testés
memo_generation(detect_gen,detect_noeud,detect_branche)=detect_gen
memo_noeud(detect_gen,detect_noeud,detect_branche)=detect_noeud
memo_branche(detect_gen,detect_noeud,detect_branche)=detect_branche
mgen.l=memo_generation(detect_gen,detect_noeud,detect_branche)
mnoeud.l=memo_noeud(detect_gen,detect_noeud,detect_branche)
mbranche.l=memo_branche(detect_gen,detect_noeud,detect_branche)
;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud.l=1
While bloc(mgen+1,newnoeud,0)\occupe=1
newnoeud=newnoeud+1; on change de noeud si ce nom de noeud est déjà pris
If newnoeud>noeud_max;calcul du nombre max de noeuds
noeud_max=newnoeud
EndIf
Wend
bloc(mgen+1,newnoeud,0)\occupe=1 ;validation des coordonnées du noeud
;création d'un nombre de blocs égal au nombre des descendants directs
For i= 1 To bloc(mgen,mnoeud,mbranche)\enfant; i compteur de branches nouvelles
bloc(mgen+1,newnoeud,i)\nom=StringField(bloc(mgen,mnoeud,mbranche)\nom_enfant,i,"|");récupération des noms des descendants(liste de noms séparés par "|")
For j =1 To compteur_procedure_max;mise à jour des renseignements du bloc avec procedure_info
If bloc(mgen+1,newnoeud,i)\nom=info_procedure(j)\nom
bloc(mgen+1,newnoeud,i)\enfant=info_procedure(j)\enfant
bloc(mgen+1,newnoeud,i)\nom_enfant=info_procedure(j)\nom_enfant
EndIf
Next j
If bloc(mgen+1,newnoeud,i)\enfant<>0 ;test du bloc crée(récursivité!)
detection_enfant(mgen+1,newnoeud,i)
EndIf
Next i
EndProcedure
Procedure.l detectionbis_enfant(detect_gen.l,detect_noeud.l,detect_branche.l)
;variables de mémorisation des blocs testés
memo_generation(detect_gen,detect_noeud,detect_branche)=detect_gen
memo_noeud(detect_gen,detect_noeud,detect_branche)=detect_noeud
memo_branche(detect_gen,detect_noeud,detect_branche)=detect_branche
mgen.l=memo_generation(detect_gen,detect_noeud,detect_branche)
mnoeud.l=memo_noeud(detect_gen,detect_noeud,detect_branche)
mbranche.l=memo_branche(detect_gen,detect_noeud,detect_branche)
If bloc(mgen,mnoeud,mbranche)\enfant=0 And mgen<generation_max;gestion des blocs sans enfants
;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud1.l=1
While bloc(mgen+1,newnoeud1,0)\occupe=1
newnoeud1=newnoeud1+1; on change de noeud si ce nom de noeud est déjà pris
Wend
bloc(mgen+1,newnoeud1,0)\occupe=1
bloc(mgen+1,newnoeud1,0)\enfant=0
bloc(mgen+1,newnoeud1,0)\nom=Str(mgen+1)+"#"+Str(newnoeud1)
bloc(mgen+1,newnoeud1,0)\origine=bloc(mgen,mnoeud,0)\origine+bloc(mgen,mnoeud,0)\nom+"|"
detectionbis_enfant(mgen+1,newnoeud1,0)
Else; si le bloc a des descendants
;on vérifie que les coordonnées du noeud de la generation suivante ne sont pas déjà attribuées
newnoeud.l=1
While bloc(mgen+1,newnoeud,0)\occupe=1
newnoeud=newnoeud+1; on change de noeud si ce nom de noeud est déjà pris
Wend
bloc(mgen+1,newnoeud,0)\occupe=1 ;validation des coordonnées du noeud
bloc(mgen+1,newnoeud,0)\enfant=bloc(mgen,mnoeud,mbranche)\enfant
bloc(mgen+1,newnoeud,0)\nom=Str(mgen+1)+"#"+Str(newnoeud)
bloc(mgen+1,newnoeud,0)\origine=bloc(mgen,mnoeud,0)\origine+bloc(mgen,mnoeud,0)\nom+"|"
;création d'un nombre de blocs égal au nombre des descendants directs
For i= 1 To bloc(mgen,mnoeud,mbranche)\enfant; i compteur de branches nouvelles
bloc(mgen+1,newnoeud,i)\nom=StringField(bloc(mgen,mnoeud,mbranche)\nom_enfant,i,"|");récupération des noms des descendants(liste de noms séparés par "|")
For j =1 To compteur_procedure_max;mise à jour des renseignements du bloc avec procedure_info
If bloc(mgen+1,newnoeud,i)\nom=info_procedure(j)\nom
bloc(mgen+1,newnoeud,i)\enfant=info_procedure(j)\enfant
bloc(mgen+1,newnoeud,i)\nom_enfant=info_procedure(j)\nom_enfant
bloc(mgen+1,newnoeud,i)\ligne_debut_code=info_procedure(j)\ligne_debut_code
bloc(mgen+1,newnoeud,i)\ligne_fin_code=info_procedure(j)\ligne_fin_code
EndIf
Next j
If mgen<generation_max
detectionbis_enfant(mgen+1,newnoeud,i)
EndIf
Next i
EndIf
If mnoeud>noeud_max;calcul du nombre max de noeuds
noeud_max=mnoeud
EndIf
EndProcedure
Procedure.l traitement_du_programme_choisi()
fichier_choisi$=OpenFileRequester("prog_detection","C:\Documents and Settings\Ploucky\Bureau\programmation\programmation_PBv4.0","Fichiers Purebasic|*.pb",0)
a$="fichier_a_traiter.text"
CreateFile(0,a$);on crée le fichier .text à partir du prog .pb choisi
CloseFile(0);fermer le fichier crée avant de le modifier!
CopyFile(fichier_choisi$,a$);on copie le fichier crée précedemment pour pouvoir le manipuler sans risques
;premier passage pour detecter les procedures et leur emplacement(ligne de debut de code)
ligne=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii )))); lecture avec espace devant et derrière supprimés+tout en minuscule
If FindString(texte$,"endprocedure",1)=0 And FindString(texte$,";",1)=0 And FindString(texte$,"endprocedure",1)=0 And FindString(texte$,"_procedure",1)=0 And FindString(texte$,"procedure",1)<>0
compteur_procedure+1
info_procedure(compteur_procedure)\nom=StringField(texte$,2," ")
info_procedure(compteur_procedure)\ligne_debut_code=ligne
EndIf
Wend
ligne_max=ligne
compteur_procedure_max=compteur_procedure
CloseFile(0)
;deuxième passage pour trouver la descendance et la ligne de fin de code
For compteur_procedure=1 To compteur_procedure_max
ligne=0
arret_comptage=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii ))))
;detection de la ligne de fin de code de la procedure
If ligne>=info_procedure(compteur_procedure)\ligne_debut_code And arret_comptage=0
info_procedure(compteur_procedure)\ligne_fin_code=ligne
;recherche des descendants directs dans la procedure
For i=1 To compteur_procedure_max
;pour la recherche on prend le nom de la procedure débarassée de ses parenthèses
If i<> compteur_procedure And FindString(texte$,StringField(info_procedure(i)\nom,1,"("),1)<>0
info_procedure(compteur_procedure)\enfant=info_procedure(compteur_procedure)\enfant+1
;listes des procedures filles séparées par un caractère "|"
info_procedure(compteur_procedure)\nom_enfant= info_procedure(compteur_procedure)\nom_enfant+info_procedure(i)\nom+"|"
EndIf
Next i
If FindString(texte$,"endprocedure",1)<>0
arret_comptage=1
EndIf
EndIf
Wend
CloseFile(0)
Next compteur_procedure
;troisième passage pour détecter les bloc.infos(generation=0, noeud=1,branche )
ligne=0
generation=0
noeud=1
branche=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii ))))
If ligne>info_procedure(compteur_procedure_max)\ligne_fin_code
If FindString(texte$,";",1)=1
branche=branche+1
bloc(generation,noeud,branche)\nom=texte$
bloc(generation,noeud,branche)\ligne_debut_code=ligne
EndIf
EndIf
Wend
CloseFile(0)
branche_max=branche
;calcul des lignes de fin de blocs
For branche=1 To branche_max-1
bloc(generation,noeud,branche)\ligne_fin_code=bloc(generation,noeud,branche+1)\ligne_debut_code-1
Next branche
bloc(generation,noeud,branche_max)\ligne_fin_code=ligne_max
;quatrième passage, detection des descendances des bloc(0,1,branche)
generation=0
noeud=1
For branche=1 To branche_max
ligne=0
OpenFile(0,a$)
While Eof(0)=0
ligne=ligne+1
texte$=LCase(Trim((ReadString(0,#PB_Ascii ))))
If ligne>=bloc(generation,noeud,branche)\ligne_debut_code And ligne<=bloc(generation,noeud,branche)\ligne_fin_code
For i=1 To compteur_procedure_max
chaine_de_recherche$=StringField(info_procedure(i)\nom,1,"(")+"("
If FindString(texte$,chaine_de_recherche$,1)<>0
bloc(generation,noeud,branche)\enfant=bloc(generation,noeud,branche)\enfant+1
bloc(generation,noeud,branche)\nom_enfant=bloc(generation,noeud,branche)\nom_enfant+info_procedure(i)\nom+"|"
EndIf
Next i
EndIf
Wend
CloseFile(0)
Next branche
; remplissage des blocs, appel de la procedure detection_enfant
For branche = 1 To branche_max
If bloc(0,1,branche)\enfant<>0
detection_enfant(0,1,branche)
EndIf
Next branche
;recherche du nombre max d'enfants
enfant_max=0
For compteur_procedure=1 To compteur_procedure_max
If info_procedure(compteur_procedure)\enfant>enfant_max
enfant_max= info_procedure(compteur_procedure)\enfant
EndIf
Next compteur_procedure
;detection du nombre max de generations
generation_max=0
While bloc(generation_max,1,1)\nom<>""
generation_max=generation_max+1
Wend; il y a (generation-1) noeuds!
;nouveau passage pour combler les branches vides jusqu'a generation_max=>renumérotation
initialisation()
noeud_max=0
bloc(0,1,0)\origine="0#1"
For branche = 1 To branche_max
detectionbis_enfant(0,1,branche);gestion des blocs avec ou sans enfants dans la procedure
Next branche
EndProcedure
Procedure decalage_des_blocs()
;remplissage de la structure descendance
For generation=0 To generation_max-1
For noeud=0 To noeud_max
bloc(generation,noeud,0)\descendance="|"
If bloc(generation,noeud,0)\nom<>""
nom$="|"+Str(generation)+"#"+Str(noeud)+"|"
For i=0 To generation_max-1
For j=0 To noeud_max
If FindString(bloc(i,j,0)\origine,nom$,1)<>0
bloc(generation,noeud,0)\descendance= bloc(generation,noeud,0)\descendance+Str(i)+"#"+Str(j)+"|"
EndIf
Next j
Next i
EndIf
Next noeud
Next generation
;decalage des noeuds de la derniere generation + remplissage des delta(voir plus loin)
generation_noeud.l=generation_max-1; il y a (generation-1) noeuds!
bloc(generation_noeud,1,0)\decalage_y=0
For noeud=2 To noeud_max; on decale les blocs de delta puis on tient compte des voisins du dessus et du dessous!
If bloc(generation_noeud,noeud,0)\nom<>""
bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud-1,0)\decalage_y+delta
If bloc(generation_noeud,noeud-1,0)\enfant<>0
bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud,0)\decalage_y+(bloc(generation_noeud,noeud-1,0)\enfant-1)*delta/2
EndIf
If bloc(generation_noeud,noeud,0)\enfant<>0
bloc(generation_noeud,noeud,0)\decalage_y=bloc(generation_noeud,noeud,0)\decalage_y+(bloc(generation_noeud,noeud,0)\enfant-1)*delta/2
EndIf
EndIf
bloc(generation_noeud,noeud,0)\delta=delta
Next noeud
;decalage des noeuds
For generation=generation_noeud-1 To 0 Step -1
For noeud=1 To noeud_max
If bloc(generation,noeud,0)\nom<>""
i=generation+1
For j=1 To noeud_max
If bloc(i,j,0)\nom<>""
nom$="|"+Str(i)+"#"+Str(j)+"|"
If FindString(bloc(generation,noeud,0)\descendance,nom$,1)<>0
If bloc(generation,noeud,0)\enfant<>0
bloc(generation,noeud,0)\decalage_y=bloc(generation,noeud,0)\decalage_y+bloc(i,j,0)\decalage_y/bloc(generation,noeud,0)\enfant
Else
bloc(generation,noeud,0)\decalage_y=bloc(generation,noeud,0)\decalage_y+bloc(i,j,0)\decalage_y
EndIf
EndIf
EndIf
Next j
EndIf
Next noeud
Next generation
;calcul des delta des noeuds(dimension de reference des branches pour les noeuds)
For generation=generation_noeud-1 To 1 Step -1
For noeud=1 To noeud_max
If bloc(generation,noeud,0)\nom<>"" And bloc(generation,noeud,0)\enfant<>0
noeudmin$="|"+StringField(bloc(generation,noeud,0)\descendance,2,"|")+"|";pour calculer delta on a besoin des branches extremes du noeud
noeudmax$="|"+StringField(bloc(generation,noeud,0)\descendance,bloc(generation,noeud,0)\enfant+1,"|")+"|"
i=generation+1;on s'interresse juste à la generation suivante
For j=1 To noeud_max
If bloc(i,j,0)\nom<>"" And noeudmax$<>noeudmin$
If FindString("|"+bloc(i,j,0)\nom+"|",noeudmin$,1)<>0
bloc(generation,noeud,0)\delta=bloc(generation,noeud,0)\delta-bloc(i,j,0)\decalage_y/(bloc(generation,noeud,0)\enfant-1)
EndIf
If FindString("|"+bloc(i,j,0)\nom+"|",noeudmax$,1)<>0
bloc(generation,noeud,0)\delta=bloc(generation,noeud,0)\delta+bloc(i,j,0)\decalage_y/(bloc(generation,noeud,0)\enfant-1)
EndIf
EndIf
Next j
EndIf
Next noeud
Next generation
;decalage des blocs de generation 0
For branche=1 To branche_max
If bloc(0,1,branche)\nom<>""
bloc(0,1,branche)\decalage_y=bloc(1,branche,0)\decalage_y
EndIf
Next branche
;decalage des autres blocs (prise en compte des enfants donc des bloc(g,n,0)\delta)
For generation=1 To generation_max
For noeud=1 To noeud_max
If bloc(generation,noeud,0)\enfant<>0
For branche=1 To bloc(generation,noeud,0)\enfant
bloc(generation,noeud,branche)\decalage_y=bloc(generation,noeud,0)\decalage_y+(2*(branche-1)-(bloc(generation,noeud,0)\enfant-1))*bloc(generation,noeud,0)\delta/2
Next branche
EndIf
Next noeud
Next generation
EndProcedure
Procedure dessin_bloc(nom_bloc.s,parent.b)
CreateSprite(#spr_bloc,#Longueur,#hbloc)
UseBuffer(#spr_bloc)
StartDrawing(SpriteOutput(#spr_bloc))
Box(0,0,128,18,RGB(255,255,0))
DrawText(49,1,nom_bloc)
StopDrawing()
DisplayTransparentSprite(#spr_code_var ,1,1)
Select parent ;affichage d'icones differents en fonction de la variable "parent"
Case 1
DisplayTransparentSprite(#spr_arbre ,33,1)
Case 2
DisplayTransparentSprite(#spr_fermer ,33,1)
EndSelect
UseBuffer(#spr_sprite_final)
EndProcedure
Procedure dessin_final()
CreateSprite(#spr_sprite_final,1024,768)
UseBuffer(#spr_sprite_final)
For generation=0 To 20
For noeud =0 To 300
For branche=1 To 100
If bloc(generation,noeud,branche)\nom<>""
dessin_bloc(bloc(generation,noeud,branche)\nom,1)
DisplaySprite(#spr_bloc,10+generation*3*#Longueur/2,bloc(generation,noeud,branche)\decalage_y)
StartDrawing(SpriteOutput(#spr_sprite_final))
If generation<>0
Line(10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,branche)\decalage_y+#hbloc/2,#Longueur/4,0,RGB(255,255,255))
EndIf
If bloc(generation,noeud,branche)\enfant<>0 And branche<>0
Line(10+generation*3*#Longueur/2+#Longueur,bloc(generation,noeud,branche)\decalage_y+#hbloc/2,#Longueur/4,0,RGB(255,255,255))
EndIf
If bloc(generation,noeud,0)\enfant<>0
LineXY(10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,1)\decalage_y+#hbloc/2,10+generation*3*#Longueur/2-#Longueur/4,bloc(generation,noeud,bloc(generation,noeud,0)\enfant)\decalage_y+#hbloc/2,RGB(255,255,255))
EndIf
StopDrawing()
EndIf
Next branche
Next noeud
Next generation
UseBuffer(-1)
EndProcedure
;initialisation*******************************
InitSprite()
InitMouse()
traitement_du_programme_choisi()
decalage_des_blocs()
;ouverture d'un écran 1024*768*********************
OpenScreen(1024,768,32,"icones")
TransparentSpriteColor(#PB_Default ,RGB(0,128,0))
;création du sprite #spr_icones***************************
dessin_icones()
;dessin des sprites
dessin(#spr_code_var,0,0,32,16)
dessin(#spr_arbre,0,16,16,16)
dessin(#spr_fermer,16,16,16,16)
dessin(#spr_souris,32,0,16,16)
dessin(#spr_panorama,32,16,16,16)
;programme principal*******************
dessin_final()
Repeat; tant que bouton droit relaché*******************
Delay(10)
ExamineMouse()
;affichage des sprites******************************
DisplaySprite(#spr_sprite_final,0,0)
DisplayTransparentSprite(#spr_souris,MouseX(),MouseY())
FlipBuffers()
Until MouseButton(#PB_MouseButton_Right )<>0
End
DataSection
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,16711680,8421376,8421376,8421376,8421376,8421376,16777215,16777215,16777215,16777215,16777215,16777215,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,16711680,16777215,16777215,16777215,16777215,16777215,16777215,16777215,0,16777215,16777215,16777215,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,12632256,8421504,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,16777215,16777215,16777215,8421376,8421376,8388608,16711680,8421376,8421376,12632256,12632256,12632256,12632256,12632256,12632256,12632256,12632256,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,16777215,12632256,12632256,8421376,8421376,8388608,16711680,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,16777215,16777215,0,16777215,16777215,0,16777215,0,0,12632256,12632256,8421376,8421376,8388608,16711680,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,12632256,8421504,8421376,8421376,8388608
Data.l 16711680,8421376,12632256,12632256,0,12632256,12632256,16777215,12632256,16777215,0,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 16711680,8421376,8421376,12632256,16777215,0,12632256,16777215,0,16777215,0,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 16711680,8421376,8421376,16777215,16777215,0,12632256,16777215,0,16777215,16777215,16777215,16777215,12632256,8421376,8388608,16711680,8421376,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,16777215,16777215,16777215,8421504,8421376,8388608
Data.l 32768,16711680,8421376,16777215,16777215,16777215,16777215,16777215,16777215,16777215,12632256,12632256,12632256,12632256,8388608,32768,32768,16711680,8421376,16777215,16777215,8421376,8421376,16777215,16777215,8421376,8421376,16777215,16777215,8421376,8388608,32768
Data.l 32768,16711680,8421376,16777215,16777215,12632256,12632256,12632256,12632256,12632256,12632256,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,16711680,8421376,12632256,12632256,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,65535,65535,32896,8421376,8388608,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,16711680,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,16711680,8421376,65535,32896,8421376,8421376,65535,32896,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,255,255,128,8421376,8421376,8421376,255,255,128,8421376,8388608,32768
Data.l 16711680,8421376,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,255,255,128,8421376,8421376,255,255,255,128,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,65535,65535,32896,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,255,255,128,8421376,255,128,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,8421376,255,255,128,8421376,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,65535,32896,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,8421376,255,255,128,8421376,8421376,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,8421376,8421376,255,128,8421376,255,255,128,8421376,8421376,8421376,8388608
Data.l 16711680,8421376,8421376,8421376,8421376,65535,32896,8421376,65535,32896,8421376,8421376,8421376,8421376,8421376,8388608,16711680,8421376,8421376,8421376,255,255,255,128,8421376,8421376,255,255,128,8421376,8421376,8388608
Data.l 32768,16711680,8421376,8421376,8421376,65535,32896,65535,32896,65535,32896,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,255,255,128,8421376,8421376,8421376,255,255,128,8421376,8388608,32768
Data.l 32768,16711680,8421376,8421376,8421376,65535,32896,65535,32896,65535,32896,8421376,8421376,8421376,8388608,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,16711680,8421376,8421376,8421376,65535,65535,65535,65535,32896,8421376,8421376,8388608,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,8421376,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
Data.l 32768,128,255,255,255,255,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,0,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,128,255,255,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,8421376,8421376,0,8421376,0,65535,0,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,128,255,255,255,255,255,255,255,255,255,128,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,65535,65535,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,128,255,255,255,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,65535,16777215,16777215,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,128,255,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,0,0,0,16777215,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,128,255,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,16777215,128,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,128,255,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,128,16777215,128,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,128,255,255,128,32768,32768,32768,32768,16711680,8421376,8421376,0,0,0,16777215,128,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,128,255,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,0,0,0,0,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,128,128,32768,32768,32768,32768,16711680,8421376,8421376,8421376,0,0,0,0,0,16777215,16777215,8421504,8421376,8421376,8421376,8388608
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,8421376,0,0,65535,16777215,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,0,8421376,0,65535,65535,65535,8421504,8421376,8421376,8421376,8388608,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,8421376,8421376,8421376,8421376,0,65535,0,8421376,8421376,8421376,8388608,32768,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,8421376,8421376,8421376,0,8421376,8421376,8388608,8388608,32768,32768,32768
Data.l 32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,32768,16711680,16711680,16711680,8388608,8388608,8388608,32768,32768,32768,32768,32768
EndDataSection