Ich wollte ein Programm haben, mit dem man Killer-Sudoku-Spielfelder erstellen, editieren und die Spiele selbst dann
abspeichern kann. Die Abspeicherung erfolgt in einer INI-Datei.
Benötigte Dateien:
- killersudoku.ahk (dieses Programm)
- Class_CtlColors.ahk (include-Datei) (aus diesem Forum; Fundstelle: http://ahkscript.org/boards/viewtopic.php?f=6&t=2197)
- killersudoku.ini (hier sind die Spiele lesbar gespeichert)
Alle DATEIEN SOLLTEN IN EINEM VERZEICHNIS UNTERGEBRACHT SEIN.
zusätzlich (nur wenn man es auch am Bildschirm spielen möchte):
- eine installierte Hardcopy-Anwendung (Icon ist im Tray sichtbar) oder jedes andere Paint-Programm
Also viel Spass.
Kommentare, Fehlerhinweise, Änderungsvorschläge, Verbesserungesvorschläge lese ich hier gerne, jedoch werde ich nichts mehr ändern oder optimieren, versucht Euch selbst daran.......
Code: Select all
/*
/*
killersudoku.ahk written by uli.sperber
free of rights
code zur weiteren Verwendung..
letzte Änderung: 06.12.2014
externe Anleihen :
zur farblichen Markierung einzelner Buttons und Trennlinien:
#Include Class_CtlColors.ahk - Fundstelle: http://ahkscript.org/boards/viewtopic.php?f=6&t=2197
für die Darstellung des Sudokufeldes in einem Zeichenprogramm, damit man es auch am Bildschirm spielen kann:
http://www.hardcopy.de/hardcopy/deutsch/ (es gibt eine Freeware-Version)
Erläuterungen zum Einbinden von Hardcopy.exe siehe weiter unten
Man kann aber auch andere paint-Programme verwenden, die die "PrintScreen (DRUCKEN)" Taste belegen können.
Zweck des Spiels: Killer-Sudoku:
Ich wollte ein Programm haben, mit dem man Killer-Sudoku-Spielfelder erstellen, editieren und die Spiele selbst dann
abspeichern kann. Die Abspeicherung erfolgt in einer INI-datei.
Man kann:
- [Laden] gespeicherte Spiele Laden (per Drop-Down-Feld)
- [Leeren] mit einem leeres Spielfeld starten,
die Linien anklicken um Ränder zu setzen oder löschen,
Zahlen in die Felder eingeben
Die Summe aller eingegebenen Zahlen muss 405 ergeben, um ein korrektes Spielfeld darzustellen. Die Summe wird rechts angezeigt.
- [Speichern] fertige Spiele speichern
- [Löschen] gespeicherte Spiele löschen
- [Linien an] die Grundlinien anzeigen lassen
- [ShowIniFile] sich die ini-Datei anzeigen lassen (*.ini sollte mit einem Text-Programm verknüpft sein)
- [SpielStarten]" Das angezeigte Spiel spielen:
- ruft das Zeichenprogramm Hardcopy auf, man kann per Rechteck das Spielfeld eingrenzen, in den Arbeitsspeicher kopieren.
Dann wird die Hardcopy-Anwendung geöffnet und man kann im Zeichenprogramm das Spiel spielen.
Benötigte Dateien:
- killersudoku.ahk (dieses Programm)
- Class_CtlColors.ahk (include-Datei)
- killersudoku.ini (hier sind die Spiele lesbar gespeichert)
Alle DATEIEN SOLLTEN IN EINEM VERZEICHNIS UNTERGEBRACHT SEIN.
zusätzlich:
- eine installierte Hardcopy-Anwendung (Icon ist im Tray sichtbar) oder jedes andere Paint-Programm
Also viel Spass. Ändern oder optimieren werde ich nichts mehr, versucht Euch selbst daran.......
*/
#NoEnv
#Include Class_CtlColors.ahk
OnExit, GuiClose
; ----------------------------------------------------------------------------------------------------
xx = 10
yy = 10
ww = 60 ; zahlen-Feldbreite und Höhe
ww2 = 4 ; Breite der Linien schmal
ww3 = 7 ; Breite der Linien breit
nr = 0
wwfirst := 10 + (9 * ww) + (6 * ww2) + (2 * ww3) ; Window-Breite des Spiels
buttonrow := wwfirst + 20
buttonrow2 := buttonrow + 20
separator := ","
savedmax := 1
spiel1 := ""
Spielname := ""
IniFile = killersudoku.ini ; Speicherort der Spiele, sollte im selben Verzeichnis liegen wie die anderen Spiele
; Aufbau Spielmaske Aussenlinien
Gui, Add, Progress, x1 y1 w%wwfirst% h10 cBlack vHLine1 ; Linie oben horiz
GuiControl,, HLine1, 100 ; Set the current position to 100.
Gui, Add, Progress, x1 y10 w10 h%wwfirst% cBlack vVLine1 ; Linie links vert
GuiControl,, VLine1, 100
Gui, Add, Progress, x10 y%wwfirst% w%wwfirst% h10 cBlack vHLine2 ; Linie unten horiz
GuiControl,, HLine2, 100 ; Set the current position to 100.
Gui, Add, Progress, x%wwfirst% y1 w10 h%wwfirst% cBlack vVLine2 ; Linie rechts vert
GuiControl,, VLine2, 100
; Buttons
gui, add, Text , x%buttonrow% y25 w120, aktuelles Spiel:
gui, add, Edit , x%buttonrow% y50 w120 vSpielname, %Spielname%
gui, add, Text , x%buttonrow% y85 w120, Spiel laden:
gui, add, Button , x%buttonrow% y140 w120, Speichern
gui, add, Button , x%buttonrow% y170 w120, Löschen
gui, add, Button , x%buttonrow% y200 w120, Leeren
gui, add, Button , x%buttonrow% y230 w120, LinienAn
gui, add, Button , x%buttonrow% y260 w120, RoteLinienAus
gui, add, Button , x%buttonrow% y290 w120, ShowIni-File
gui, add, Button , x%buttonrow% y320 w120, PlayGameWithPaint
gui, add, Text , x%buttonrow% y400 w120 r2 vSumme, Summe
gosub, addDropDownList
Gui, Add, DropDownList, x%buttonrow2% y110 w100 vAuswahl gAuswahl, %alleSpiele%
gosub, zeichnezahlenfelder ; Aufbau 9x9 Spielfeld
; rote quadrat zwischenlinien
xstart := 10 + (3 * ww) + (2 * ww2) + 3
Gui, Add, Progress, x5 y%xstart% w%wwfirst% h3 cRed vHLine3
GuiControl,, HLine3, 100 ; Set the current position to 100.
xstart2 := 10 + (6 * ww) + (4 * ww2) + ww3 + 3
Gui, Add, Progress, x5 y%xstart2% w%wwfirst% h3 cRed vHLine4
GuiControl,, HLine4, 100 ; Set the current position to 100.
Gui, Add, Progress, x%xstart% y5 w3 h%wwfirst% cRed vVLine3
GuiControl,, VLine3, 100
Gui, Add, Progress, x%xstart2% y5 w3 h%wwfirst% cRed vVLine4
GuiControl,, VLine4, 100
GuiControl, hide, VLine3
GuiControl, hide, VLine4
GuiControl, hide, HLine3
GuiControl, hide, HLine4
Gui, Show, AutoSize Center ,Killer Sudoku
return ; End of auto-execute section. The script is idle until the user does something.
GuiClose:
Gui, Submit ; Save the input from the user to each control's associated variable.
ExitApp
;--------------------------------------------- Ini-Datei in einem textprogramm anzeigen
ButtonShowIni-File:
Run %iniFile%
return
;--------------------------------------------- Spiel spielen
ButtonPlayGameWithPaint:
/* Diese Arbeit macht ausschließlich das Programm hardcopy.exe
Ablauf: hardcopy downloaden und installieren und starten.
danach sollte im Tray rechts unten der Hardcopy-ICON zu sehen sein.
dann einmalig ausführen:
-- Rechtsklick auf ICON , dann "Hardcopy-Fenster offnen" anklicken
-- In der Anwendung Hardcopy die PrintScreen Taste (auf Tastatur: DRUCKEN) belegen mit der hier erforderlichen
-- Funktionalität:
-- Einstellungen -> Schnelleinstellungen -> Taste Druck -> Fenster -> Hardcopy-Fenster öffnen
fertig
Wenn Ihr jetzt die Taste "Drucken" drückt, erscheint der Screen in der Hardcopyanwendung, Fertig.
Wenn Ihr nur das Spielfeld ohne Button-Tasten wollt:
-- Einstellungen -> Schnelleinstellungen -> Taste Druck -> Rechteck -> Hardcopy-Fenster öffnen
^^^^^^^^
Wenn Ihr jetzt die Taste "Drucken" drückt, erscheint ein Fadenkreuz, mit dem ihr ein Rechteck (das Spielfeld) per Maus auswählen könnt,
danach öffnet sich das ausgeschnittene Spielfeld in der Hardcopyanwendung, Fertig.
Jetzt könnt Ihr beginnen mit dem Bleistifft die Zahlen in die Felder zu malen, oder wenn sie falsch waren, wieder auszuradieren.
Daneben könnt Ihr das Spiel jetzt als Grafik speichern oder auch Zwischenstände speichern.
Im AHK-ist die Programmierung jetzt recht einfach:
Der Button "ButtonPlayGameWithPaint" ruft lediglich die Taste "PrintScreen" auf.
Alternativ könnte man natürlich auch die Bildschirm-Kopie manuell machen und jedes andere Zeichenprogramm verwenden.
vorher blende ich noch rote linien ein
*/
GuiControl, show, VLine3
GuiControl, show, VLine4
GuiControl, show, HLine3
GuiControl, show, HLine4
; sleep, 1000
Send {PrintScreen}
return
;----------------------------------------------------------- Rote Linien ausblenden bei Bedarf
ButtonRoteLinienAus:
GuiControl,, VLine4, 100
GuiControl, hide, VLine3
GuiControl, hide, VLine4
GuiControl, hide, HLine3
GuiControl, hide, HLine4
return
;----------------------------------------------------------- Spiele aus der ini-Datei lesen und in die Drop-Downliste einfügen
addDropDownList:
IfNotExist %IniFile%
{
MsgBox Kann %IniFile% nicht finden.
ExitApp
}
alleSpiele =
IniRead, alleSpiele, %IniFile%, all, all
Sort, alleSpiele, D|
If (alleSpiele <> "ERROR")
{
StringReplace, alleSpiele, alleSpiele, `,, |, All ; die PIPE ist wichtig
}
else
{
msgbox Es sind noch keine Spiele gespeichert...
alleSpiele =
}
return
;--------------------------------------------- es wurde ein Spiel zum Laden ausgesucht
Auswahl:
; Update all variables from the gui, without hiding the Gui.
Gui, Submit, NoHide
gosub, ButtonLaden
return
;--------------------------------------------- Das aktuell angezeigte Spiel soll gelöscht werden
ButtonLöschen:
MsgBox, 4,, Spiel %Spielname% löschen?
IfMsgBox No
return
gefunden = nein
var = %Spielname%| ; Spielname ist am Anfang der Zeile (PIPE rechts)
; msgbox var= %var% %alleSpiele%
IfInString, alleSpiele, %var%
{
StringReplace, alleSpiele, alleSpiele, %var% ,
IniWrite, %alleSpiele%,%IniFile%, all, all ; all-Sektion aktualisieren
Guicontrol,,Auswahl, |%alleSpiele% ; DropDownfeld aktualisieren (PIPE ist wichtig!)
Msgbox Spiel %Spielname% ist gelöscht
Gui, Submit , NoHide
IniDelete, %IniFile%, Spiele , %Spielname% ; Das ausgesuchte Spiel läöschen in ini
gefunden = ja
}
if (gefunden = "nein")
{
var = |%Spielname% ; neue Suche: Spielname ist am Ende der Zeile (PIPE links) oder mittendrin
; msgbox var= %var% %alleSpiele%
IfInString, alleSpiele, %var%
{
StringReplace, alleSpiele, alleSpiele, %var% ,
IniWrite, %alleSpiele%,%IniFile%, all, all
Guicontrol,, Auswahl, |%alleSpiele%
Msgbox Spiel %Spielname% ist gelöscht
Gui, Submit , NoHide
IniDelete, %IniFile%, Spiele , %Spielname%
gefunden = ja
}
}
if (gefunden = "nein")
{
msgbox Spiel %Spielname% wurde nicht gefunden
}
return
;---------------------------------------------
ButtonLaden:
; IniRead, Text2, Config.ini, Generel, Spielname
IniRead, spiel, %IniFile%, Spiele, %Auswahl%
SpielArray := StrSplit(spiel, ",")
Loop % SpielArray.MaxIndex()
{
this_field := SpielArray[a_index]
if (a_index = 1) { ; erstes Feld des Arrays ist Spielname
Spielname = %this_field%
GuiControl,, Spielname , %this_field%
nr = 1 ; nr=1 ist Zahlenfeld,
; nr=2 ist Linie rechts neben Zahlenfeld verikal an/aus,
; nr=3 ist linie unter dem zahlenfeld horizontal an/aus
feldnr := 1 ; Feldnr sind die zahlenfelder 9x9 von 1 bis 81
}
else
{
; msgbox index= %A_index% nummer=%nr% feld= %feldnr% inhalt= %this_field%
if (nr = 1) {
GuiControl,, T%feldnr% , %this_field% ; Zahlenfeld T1 mit dem Spielnamen belegen
nr += 1 ; nächstes feld 2 ist Linie rechts vertikal
} else
if (nr = 2) { ; Linie rechts neben dem zahlenfeld färben
; Msgbox thisfieldstart=>%this_field%<
if (this_field = "") ; leeres feld abfangen
{
this_field = aus
}
varRT%feldnr% = %this_field% ; varRT1 mit "an" oder "aus" belegen
status = %this_field% ; ab hier Linie schwarz(an) oder weiss (aus) färben
RBG = %feldnr%
gosub, GetColor
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; statt dessen neue einstellung setzen
nr += 1 ; neue nr = 3 , nun zur Linie unter dem feld
} else
if (nr = 3) { ; Linie unter dem zahlenfeld färben
if (this_field = "") ; leeres feld abfangen
{
this_field = aus
}
; msgbox feldnummer=>%feldnr%< thisfield=>%this_field%<
varRT%feldnr%009 = %this_field% ; varRT1009 mit "an" oder "aus" belegen
status = %this_field% ; ab hier Linie schwarz(an) oder weiss (aus) färben
RBG = %feldnr%009
gosub, GetColor
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; statt dessen neue einstellung setzen
nr = 1 ;
feldnr += 1
}
}
}
return
;---------------------------------------------
ButtonSpeichern:
GuiControlGet, Spielname, , Spielname
IfNotInString, alleSpiele, %Spielname% ; wenn spielname neu ist in der ini, speicher
{
alleSpiele = %alleSpiele%|%Spielname%
IniWrite, %alleSpiele%,%IniFile%, all, all ; scheib all-Section
IniRead, alleSpiele, %IniFile%, all, all ; lese sie wieder
Sort, alleSpiele, D| ; sortiere alphabetisch
Guicontrol,,Auswahl, |%alleSpiele% ; und gebe die neue Spielliste an das DropownFeld
gosub, saveSpiel ; und nun speicher die zahlen, felder und linien-Stati
Msgbox Spiel %Spielname% ist gespeichert
Gui, Submit , NoHide
return ; return, wenn spielname neu war, sonst weiter in dieser sub....
}
MsgBox, 4,, Spiel %Spielname% ist bereits vorhanden. Willst Du das Spiel überschreiben? Du kannst auch den Namen im Feld "aktuelles Spiel" ändern.
IfMsgBox No
return
gosub, saveSpiel ; hier nur speicher die zahlen, felder und linien-Stati, add-section kennt die ini schon
Msgbox Spiel %Spielname% ist gespeichert
Gui, Submit , NoHide
return
;---------------------------------------------
saveSpiel:
spiel = %Spielname%%separator% ; Spielname und semikolon als separator
loop, 81
{
GuiControlGet, var, , T%A_Index% ; hole spielname
spiel = %spiel%%var%%separator% ; spielname;
var := varRT%A_Index% ;
spiel = %spiel%%var%%separator% ; spielname;zahlenfeld1
var := varRT%A_Index%009
spiel = %spiel%%var%%separator%
}
; Guicontrol,,Spiel, %spiel%
IniWrite, %spiel%, %IniFile%, Spiele, %Spielname%
return
;---------------------------------------------
ButtonLeeren:
Gui, Submit, Nohide
loop, 81 {
GuiControl,, T%A_Index% , ; Ziffernfeld leeren
status = aus
RBG = %A_Index%
varRT%A_Index% = aus ; Linie Rechts vom feld auf aus setzen
gosub, GetColor ; Farbe für leer holen
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; statt dessen neue einstellung setzen
varRT%A_Index%009 = aus ; Linie unter dem Feld auf aus setzen
RBG = %A_Index%009
gosub, GetColor
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; statt dessen neue einstellung setzen
}
Spielname = leer
Guicontrol,,Spielname, %Spielname%
gosub, buttonBerechnen
return
;---------------------------------------------
ButtonLinienAn:
Gui, Submit, Nohide
loop, 81 {
status = an ; status ist hier immer "an"
RBG = %A_Index% ; Linie Rechts vom feld auf an setzen
varRT%A_Index% = an
gosub, GetColor
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; statt dessen neue einstellung setzen
RBG = %A_Index%009 ; Linie unter dem Feld an aus setzen
varRT%A_Index%009 = an
gosub, GetColor
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; statt dessen neue einstellung setzen
}
return
;---------------------------------------------
ButtonBerechnen:
Gui, Submit, Nohide
summe := 0
loop, 81 {
summe += T%A_Index%
}
Guicontrol,,Summe, Summe:`n %Summe% von 405
Return
;---------------------------------------------
zeichneZahlenfelder:
loop, 9 {
loop 9 {
nr += 1
Gui, Add, Edit, x%xx% y%yy% w%ww% h%ww% cBlack LEFT vT%nr% number gButtonBerechnen hwndTID%nr% -Multi , %nr%
CtlColors.Attach(TID%nr%, "White", "Black") ; vorbelegung black on white
; --------- horizontale Trennlinien
if (nr >= 19 and nr <= 27) or (nr >= 46 and nr <= 54) { ; alle drei zeilen dicke linie ww3)
y3 := yy + ww
h3 := ww3
}
else {
y3 := yy + ww
h3 := ww2
}
Gui, Add, Text, x%xx% y%y3% w%ww% h%h3% cBlack gRBG vRT%nr%009 hwndRTID%nr%009, ------
varRT%nr%009 = aus
hwndVarRT%nr%009 := RTID%nr%009
; ---------------- keine Trennlinien mehr nach letzter Zeile
if (nr > 72) {
GuiControl, hide, RT%nr%009
}
; --------- vertikale Trennlinien
h2 := ww
y2 := yy
xx += ww
x2 := xx
if or (nr = 3) or (nr = 6) or (nr = 12) or (nr = 15) or (nr = 21) or (nr = 24) or (nr = 30) or (nr = 33) or (nr = 39) or (nr = 42) or (nr = 48) or (nr = 51) or (nr = 57) or (nr = 60) or (nr = 66) or (nr = 69) or (nr = 75) or (nr = 78) {
xx+= ww3
w2 := ww3
}
else {
xx+= ww2
w2 := ww2
}
Gui, Add, Text, x%x2% y%y2% w%w2% h%h2% c0xF0F0F0 gRBG vRT%nr% hwndRTID%nr%,---------
varRT%nr% = aus
hwndVarRT%nr%:= RTID%nr%
; ---------------- keine Trennlinien mehr nach letzter Spalte
if (nr = 9) or (nr = 18) or (nr = 27) or (nr = 36) or (nr = 45) or (nr = 54) or (nr = 63) or (nr = 72) or (nr = 81) {
GuiControl, hide, RT%nr%
}
}
xx := 10
yy += ww
y2 := yy
if (nr = 27) or (nr = 54) {
yy += ww3
h2 := w3
}
else {
yy += ww2
h2 := ww2
}
}
gosub, buttonBerechnen
return
;---------------------------------------------
RBG:
RBG := SubStr(A_GuiControl, 3)
GuiC := A_GuiControl
status := var%A_GuiControl%
rtis2 := RTID%RBG%
; sgbox %GuiC%: status ist >%status%< RBG is %RBG% RTID is %rtis2%
If (status = "an") ; linie ist an, also ausschalten
{
var%A_GuiControl% := "aus"
status := "aus"
gosub GetColor
} else ; linie ist aus, also anschalten
{
var%A_GuiControl% := "an"
status := "an"
gosub GetColor
}
CtlColors.Detach(RTID%RBG%) ; alte einstellung löschen
CtlColors.Attach(RTID%RBG%, newColor, newColor) ; linie auf schwarz
Return
;---------------------------------------------
GetColor:
; parameter: status=an oder aus; RBG= RTID%RBG%
; msgbox status ist >%status%< RBG is %RBG%
; colors AQUA; BLACK, BLUE, FUCHSIA, GRAY, GREEN, LIME, MAROON, NAVY, OLIVE, PURPLE, RED, SILVER, TEAL, WHITE, YELLOW
; additional colors defined as follows:
PURPLELIGHT= 0x4040FF,
BACKGR= 0xF0F0F0,
BACKGR2= 0xEEFFFF
If (status = "an")
{
newColor := "BLACK"
altColor := "BLACK" ; Farbe für Quadrat-Linien vertikal nach Zeilen 3 und 6, horizontal nach spalten 3 und 6
} else
{
newColor := "BACKGR"
altColor := "BACKGR2" ; Farbe für Quadrat-Linien vertikal nach Zeilen 3 und 6, horizontal nach spalten 3 und 6
}
;------------------------------------------------------ vertikale linien nach dritter und sechster Spalte
if (RBG = 3) or (RBG = 6) or (RBG = 12) or (RBG = 15) or (RBG = 21) or (RBG = 24) or (RBG = 30) or (RBG = 33) or (RBG= 39) or (RBG= 42) or (RBG= 48) or (RBG= 51) or (RBG= 57) or (RBG= 60) or (RBG= 66) or (RBG= 69) or (RBG= 75) or (RBG= 78) {
newColor := altColor
}
;----------------------------------------------------- horizontale linien nach dritter zeile
if (RBG = 19009) or (RBG = 20009) or (RBG = 21009) or (RBG = 22009) or (RBG = 23009) or (RBG = 24009) or (RBG = 25009) or (RBG = 26009) or (RBG = 27009) {
newColor := altColor
}
;----------------------------------------------------- horizontale linien nach sechster zeile
if (RBG = 46009) or (RBG = 47009) or (RBG = 48009) or (RBG = 49009) or (RBG = 50009) or (RBG = 51009) or (RBG = 52009) or (RBG = 53009) or (RBG = 54009) {
newColor := altColor
}
return
Muster killersudoku.ini:
Code: Select all
[all]
[all]
all=07-10|09-08|11-04|11-05|14-07|17-13|33|leer|11-11
[Spiele]
leer=leer,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,,aus,aus,
33=33,1,aus,aus,2,aus,aus,3,aus,aus,4,aus,aus,5,aus,aus,6,aus,aus,7,aus,aus,8,aus,aus,9,aus,aus,10,aus,aus,11,aus,aus,12,aus,aus,13,aus,aus,14,aus,aus,15,aus,aus,16,aus,aus,17,aus,aus,18,aus,aus,19,aus,aus,20,aus,aus,21,aus,aus,22,aus,aus,23,aus,aus,24,aus,aus,25,aus,aus,26,aus,aus,27,aus,aus,28,aus,aus,29,aus,aus,30,aus,aus,31,aus,aus,32,aus,aus,33,aus,aus,34,aus,aus,35,aus,aus,36,aus,aus,37,aus,aus,38,aus,aus,39,aus,aus,40,aus,aus,41,aus,aus,42,aus,aus,43,aus,aus,44,aus,aus,45,aus,aus,46,aus,aus,47,aus,aus,48,aus,aus,49,aus,aus,50,aus,aus,51,aus,aus,52,aus,aus,53,aus,aus,54,aus,aus,55,aus,aus,56,aus,aus,57,aus,aus,58,aus,aus,59,aus,aus,60,aus,aus,61,aus,aus,62,aus,aus,63,aus,aus,64,aus,aus,65,aus,aus,66,aus,aus,67,aus,aus,68,aus,aus,69,aus,aus,70,aus,aus,71,aus,aus,72,aus,aus,73,aus,aus,74,aus,aus,75,aus,aus,76,aus,aus,77,aus,aus,78,aus,aus,79,aus,aus,80,aus,aus,81,aus,aus,
11-05=11-05,11,an,aus,5,an,aus,34,aus,aus,,aus,an,,an,aus,13,aus,an,,an,an,10,an,aus,7,aus,aus,,an,an,,an,an,,an,aus,12,an,aus,,an,aus,23,aus,aus,,an,aus,,an,an,,aus,an,11,aus,an,,an,an,,an,an,,an,an,,an,an,,aus,an,,an,aus,10,aus,an,,aus,an,10,an,aus,22,an,aus,5,aus,an,,an,an,11,aus,aus,,an,an,,an,an,36,an,aus,11,aus,aus,,an,aus,,an,aus,13,aus,an,,an,an,,an,an,11,aus,an,,an,an,,an,aus,,aus,an,,an,an,,an,an,9,aus,an,,an,an,12,aus,an,,an,an,,aus,aus,,an,aus,3,aus,aus,10,aus,an,,an,an,12,aus,an,,an,an,14,aus,an,,an,an,,aus,an,,an,an,,aus,an,13,an,aus,7,aus,an,,an,an,14,an,aus,8,aus,an,,an,an,12,aus,an,,an,an,15,aus,aus,,an,aus,7,aus,aus,,an,aus,,an,aus,5,aus,aus,,an,aus,9,aus,aus,,an,aus,,aus,aus,
07-10=07-10,7,aus,an,,an,an,10,aus,an,,an,an,9,aus,an,,an,an,16,aus,an,,an,an,5,aus,aus,15,an,aus,10,aus,an,,an,an,6,an,aus,17,aus,an,,an,aus,11,an,aus,12,an,aus,,aus,an,,an,an,11,an,aus,12,an,aus,,an,an,9,an,aus,,an,an,,an,an,,an,an,7,aus,aus,7,an,aus,,an,an,,an,an,15,an,aus,,an,an,8,an,aus,11,an,aus,8,an,aus,,aus,an,,an,an,10,aus,an,,an,an,,an,an,,aus,an,,an,an,,an,an,,an,an,18,aus,aus,7,an,aus,11,aus,an,,an,an,10,an,aus,25,aus,aus,,aus,an,,an,aus,,aus,an,,aus,an,,an,an,15,aus,an,,an,an,,an,an,,an,an,9,an,aus,,an,an,11,aus,an,,aus,an,10,aus,an,,an,an,8,aus,an,,an,an,10,an,aus,,an,an,10,aus,an,,an,an,20,aus,aus,5,aus,aus,,an,aus,11,aus,aus,,an,aus,,an,aus,9,aus,aus,,an,aus,,aus,aus,,aus,aus,
11-04=11-04,11,aus,an,,an,an,4,an,aus,21,aus,aus,,aus,an,,an,an,17,an,aus,13,an,aus,8,aus,aus,11,aus,an,,an,an,,an,an,,an,an,12,an,aus,13,an,aus,,an,aus,,an,an,,aus,an,14,aus,an,,an,an,7,aus,an,,an,an,,an,an,,an,aus,,an,aus,15,an,aus,7,aus,aus,16,an,aus,17,aus,aus,,aus,an,,an,an,12,an,aus,,an,an,,an,an,,an,an,,aus,an,,an,an,,an,an,5,aus,an,,an,an,,an,an,10,aus,an,,an,an,12,aus,an,,aus,an,25,aus,an,,aus,an,,aus,an,,an,an,15,an,aus,6,aus,an,,an,an,9,an,aus,9,aus,aus,6,aus,an,,an,an,16,an,aus,10,an,aus,,an,an,9,aus,an,,an,an,,an,an,,aus,an,11,an,aus,6,an,aus,,an,an,,aus,an,,an,aus,15,an,aus,15,an,aus,6,aus,an,,aus,an,,an,aus,,an,aus,11,aus,aus,,an,aus,,an,aus,,an,aus,,an,aus,11,aus,aus,,aus,aus,
14-07=14-07,14,an,aus,7,an,aus,10,aus,an,,an,an,12,aus,an,,an,an,21,aus,aus,,an,aus,14,aus,aus,,an,an,,an,an,22,aus,aus,,an,aus,8,an,aus,,aus,an,,aus,an,,an,an,,aus,an,10,aus,an,,an,an,,aus,an,,an,an,,an,an,6,aus,an,,an,an,12,an,aus,22,aus,aus,16,an,aus,5,aus,an,,an,an,13,aus,an,,an,an,7,aus,an,,an,an,,an,an,,aus,aus,,an,an,7,aus,an,,an,an,6,aus,an,,an,an,8,aus,an,,an,an,10,an,aus,,aus,aus,13,aus,an,,an,an,13,an,aus,16,aus,an,,an,an,9,aus,an,,an,an,,an,an,,aus,aus,11,aus,an,,an,an,,an,an,4,an,aus,16,aus,aus,,an,an,6,aus,an,,an,an,,aus,an,8,aus,an,,an,an,14,an,aus,,an,an,,an,an,16,aus,an,,an,an,10,aus,an,,aus,an,3,aus,aus,,an,aus,,an,aus,14,aus,aus,,an,aus,12,aus,aus,,an,aus,10,aus,aus,,aus,aus,
0=0,1,aus,aus,2,aus,aus,3,aus,aus,4,aus,aus,5,aus,aus,6,aus,aus,7,aus,aus,8,aus,aus,9,aus,aus,10,aus,aus,11,aus,aus,12,aus,aus,13,aus,aus,14,aus,aus,15,aus,aus,16,aus,aus,17,aus,aus,18,aus,aus,19,aus,aus,20,aus,aus,21,aus,aus,22,aus,aus,23,aus,aus,24,aus,aus,25,aus,aus,26,aus,aus,27,aus,aus,28,aus,aus,29,aus,aus,30,aus,aus,31,aus,aus,32,aus,aus,33,aus,aus,34,aus,aus,35,aus,aus,36,aus,aus,37,aus,aus,38,aus,aus,39,aus,aus,40,aus,aus,41,aus,aus,42,aus,aus,43,aus,aus,44,aus,aus,45,aus,aus,46,aus,aus,47,aus,aus,48,aus,aus,49,aus,aus,50,aus,aus,51,aus,aus,52,aus,aus,53,aus,aus,54,aus,aus,55,aus,aus,56,aus,aus,57,aus,aus,58,aus,aus,59,aus,aus,60,aus,aus,61,aus,aus,62,aus,aus,63,aus,aus,64,aus,aus,65,aus,aus,66,aus,aus,67,aus,aus,68,aus,aus,69,aus,aus,70,aus,aus,71,aus,aus,72,aus,aus,73,aus,aus,74,aus,aus,75,aus,aus,76,aus,aus,77,aus,aus,78,aus,aus,79,aus,aus,80,aus,aus,81,aus,aus,
17-13=17-13,17,aus,an,,an,an,13,aus,an,,an,an,13,an,aus,7,aus,an,,an,an,22,an,aus,6,aus,aus,5,aus,an,,an,an,9,aus,an,,an,an,,an,an,7,an,aus,15,an,aus,,an,aus,,aus,an,13,an,aus,9,aus,an,,an,an,5,aus,an,,an,an,,an,an,,an,an,,aus,an,,aus,an,,an,an,24,aus,an,,aus,an,,aus,an,,an,an,11,aus,an,,an,an,4,aus,an,,aus,an,17,aus,an,,an,aus,9,aus,an,,an,an,15,aus,an,,an,an,9,aus,an,,an,an,9,aus,aus,7,an,aus,,aus,an,,an,an,10,an,aus,22,aus,aus,,aus,an,,an,aus,10,an,aus,,aus,an,,an,an,15,aus,an,,an,an,,an,an,,an,an,12,an,aus,,an,an,,an,an,13,aus,aus,12,aus,an,,an,an,11,aus,an,,an,an,8,an,aus,,an,an,7,aus,an,,an,an,,aus,an,3,aus,aus,,an,aus,9,aus,aus,,an,aus,,an,aus,12,aus,aus,,an,aus,15,aus,aus,,aus,aus,
09-08=09-08,9,an,aus,8,aus,an,,an,an,3,an,aus,11,an,aus,11,aus,an,,an,an,17,aus,an,,aus,an,,an,an,6,aus,an,,an,an,,an,an,,an,an,17,an,aus,19,aus,aus,,aus,an,,aus,aus,12,an,aus,12,an,aus,7,an,aus,10,an,aus,7,an,aus,,an,an,,an,an,9,an,aus,,aus,an,,an,an,,an,an,,an,an,,an,an,,an,aus,14,aus,an,,an,an,,an,an,15,aus,aus,6,aus,an,,an,an,17,aus,an,,an,an,,an,an,9,an,aus,9,an,aus,4,an,aus,,aus,an,24,aus,aus,,an,aus,18,aus,an,,aus,an,,an,an,,an,an,,an,an,,an,an,9,aus,aus,,aus,an,,aus,an,,an,an,34,aus,an,,an,aus,3,an,aus,15,an,aus,17,an,aus,,aus,an,11,an,aus,15,aus,an,,aus,an,,an,an,,an,aus,,an,an,,an,an,,an,aus,4,aus,aus,,an,aus,15,aus,aus,,an,aus,,aus,aus,,an,aus,8,aus,aus,,an,aus,,an,aus,,aus,aus,
11-11=11-11,11,aus,an,,an,an,11,aus,an,,an,an,11,aus,an,,an,an,23,an,aus,11,aus,an,,aus,an,10,aus,an,,an,an,27,aus,an,,aus,an,,aus,an,,an,aus,,aus,aus,,an,aus,11,aus,aus,29,an,aus,8,an,aus,12,an,aus,5,aus,an,,an,an,,an,an,,aus,an,,an,an,,aus,an,,an,aus,,an,an,,an,an,9,aus,an,,an,an,17,an,aus,14,aus,an,,an,an,3,aus,aus,,aus,an,,aus,an,,an,an,4,aus,an,,an,an,,an,an,9,aus,an,,an,an,,aus,an,13,an,aus,3,aus,an,,an,an,24,an,aus,9,aus,an,,an,an,10,an,aus,12,aus,an,,aus,an,,an,an,21,an,aus,13,an,aus,,an,aus,7,aus,an,,an,an,,an,an,16,aus,an,,aus,an,3,an,aus,,an,aus,,an,an,,aus,an,,aus,an,,an,an,11,an,aus,5,aus,an,,aus,an,,an,aus,,an,aus,12,aus,aus,,an,aus,11,aus,aus,,an,aus,,an,aus,10,aus,aus,,aus,aus,