' CHIP8
' SEE HTTPS://CHIP-8.GITHUB.IO/LINKS/#EMULATORINTERPRETER-DEVELOPMENT
' AND HTTP://WWW.MULTIGESTURE.NET/ARTICLES/HOW-TO-WRITE-AN-EMULATOR-CHIP-8-INTERPRETER/
KEYBOARD ON
ON RASTER CALL MICROROWS
ON VBL CALL UPDATECLOCK
'A = $000A20/8
'B = $F0


' ------------------ CHIP8 MEMORY ------------------ 

'RANDOM ACCESS MEMORY
RAM=$E000

'CPU REGISTERS
DIM GLOBAL V(15)

'PROGRAM COUNTER
PC=RAM+$200

'INDEX REGISTER
IREG=0

'ST TIMER
ST=0

'NORMAL TIMER
DT=0

'STACK POINTER
DIM GLOBAL STACK(15)
SP=0

KEY=-1
LASTKEY=-1

CYCLES = 0

GLOBAL IREG, RAM, SP, PC, ST, DT, KEY, CYCLES, LASTKEY

' ------------------ MY VARS ------------------ 
'OTHER VARS
NAME$=""

MODE=0
_STEP = 0
_PLAY = 1
_EDIT = 2
_POWER = 3
HDISP=0
HITTING=0

TRUE=-1

GLOBAL TRUE, FALSE, NAME$, MODE, _STEP, _PLAY, _EDIT,_POWER, HITTING, OUT, OUT$, R, R$

' ------------------ SETTINGS ------------------ 
RESOX = 64
RESOY = 32
PALSCREEN = 0
CHRSCREEN = 64
SHOWNAMES = TRUE
RAMSIZE = 4096
CYCLEPERVBL = 5
GLOBAL RESOX, RESOY, PALSCREEN, CHRSCREEN, SHOWNAMES, CYCLEPERVBL

' ---------------- SPRITE SETTINGS --------------
SPRITE 63 PAL 5
SPRITE 40 PAL 5 SIZE 1
' ------------------ KEY CONFIG------------------ 
'ORIGINAL CONFIG
KORIG$ = ""
KORIG$ = KORIG$+"123C"
KORIG$ = KORIG$+"456D"
KORIG$ = KORIG$+"789E"
KORIG$ = KORIG$+"A0BF"
'MY KEY CONFIG (CHANGE THIS FOR YOURS)
KCONF$ = ""
KCONF$ = KCONF$+"1234"
KCONF$ = KCONF$+"AZER"
KCONF$ = KCONF$+"QSDF"
KCONF$ = KCONF$+"WXCV"
GLOBAL KCONF$, KORIG$

' ------------------ GAMES ADDR ------------------ 
GAMEROM = ROM(5)
LASTLINE = 749
NBGAMES = 23
DIM GLOBAL GAME(NBGAMES)
DIM GLOBAL GNAME$(NBGAMES)
FOR I=0 TO NBGAMES
    READ GAME(I)
    READ GNAME$(I)
NEXT I
DATA 1   , "15PUZZLE"
DATA 26  , "BLINKY"
DATA 175 , "BLITZ"
DATA 201 , "BRIX"
DATA 220 , "CONNECT4"
DATA 234 , "GUESS"
DATA 245 , "HIDDEN"
DATA 300 , "INVADERS"
DATA 382 , "KALEID"
DATA 391 , "MAZE"
DATA 395 , "MERLIN"
DATA 418 , "MISSILE"
DATA 431 , "PONG"
DATA 448 , "PONG2"
DATA 466 , "PUZZLE"
DATA 479 , "SYZYGY"
DATA 540 , "TANK"
DATA 576 , "TEST"
DATA 607 , "TETRIS"
DATA 639 , "TICTAC"
DATA 671 , "UFO"
DATA 686 , "VBRIX"
DATA 719 , "VERS"
DATA 735 , "WIPEOFF"


' ------------------ INITIALISATION ------------------ 
INIT:
    CLS

    'INIT VARS
    IREG = 0
    PC = 0
    ST = 0
    DT = 0
    PC=RAM+$200

    CALL INITSCREEN(FALSE)

    'CLEAR STACK & REGISTERS
    SP=0
    FOR I=0 TO 15
        STACK(I) = 0
        V(I) = 0
    NEXT I

    CALL PRINTALL

    'LOADING FONT TO RAM+$000
    GOSUB LOADFONT

' ------------------ MAIN LOOP ------------------ 
MAIN:
DO 
    K=0
    K$=INKEY$
    CALL GETKEY(K$)

    IF K$<>"" THEN K = ASC(K$)
    IF K$=";" THEN GOTO INIT
    IF K$="?" THEN GOTO LOADROM
    IF K$="," THEN GOTO LOADEXTROM
    IF K$="." THEN GOTO SAVEDISK
    IF K$="+" THEN GOTO SETTINGS
    IF K$="H" THEN GOSUB HELP
    IF K$="P" AND MODE<>_POWER THEN 
        MODE=_POWER
        K$=""
        CLS
    END IF

    IF MODE = _STEP THEN
        GOSUB STEPMODE
    ELSE IF MODE = _PLAY OR MODE = _POWER THEN 
        IF K = 10 OR K$="P" THEN 
            MODE=_STEP
            CALL PRINTALL
        END IF
        CALL DOCYCLE
    ELSE IF MODE = _EDIT THEN 
        GOSUB EDITRAM
    END IF
    'WAIT VBL

LOOP
' --------------------------------------------------- 

CLEARRAM:
    'CLEAR RAM
    FILL RAM, $1000, 0
RETURN

LOADFONT:
    'LOAD FONTS
    COPY ROM(4), 80 TO RAM
RETURN

HELP:
    PAL 4
    IF NOT HDISP THEN
        CALL MICRO(0, 20,"?-LOAD .-SAVE ;-RESET SPC-STEP RET/P-RUN")
        HDISP=-1
    ELSE
        CALL MICRO(0, 20,"                                        ")
        HDISP=0
    END IF
    
RETURN 

PRINTFILES:
    CLS
    FOR I=0 TO 15
        TAB$ = " "
        IF I>=10 THEN TAB$ = ""
        CALL MICRO(1, I+3, TAB$+STR$(I)+" - "+FILE$(I)+" ")
        WAIT VBL
    NEXT I

RETURN

PRINTROMS:
    CLS
    FOR I=0 TO NBGAMES
        TAB$ = " "
        S = 1
        IF I>=10 THEN TAB$ = ""
        IF I>NBGAMES/2 THEN S=NBGAMES/2+1
        CALL MICRO(S, I-S+5, TAB$+STR$(I)+" - "+GNAME$(I)+" ")
        WAIT VBL
    NEXT I
RETURN

QUESTION:
    CALL MICRO(1, 0, LEFT$(QUESTION$+"                        ", 40))
    LOCATE 0, 1
    INPUT " ";R$
    R = VAL(R$)
    WAIT VBL
RETURN

SETTINGS:
    CLS
    SPRITE OFF
    PAL 0
    QUESTION$ = "CYCLE PER VBL (MAX SPEED)? (CURR="+STR$(CYCLEPERVBL)+") "
    GOSUB QUESTION
    IF R>0 THEN CYCLEPERVBL = R
    QUESTION$ = "CHENGE KEYBOARD LAYOUT (Y/N) ? "
    GOSUB QUESTION
    IF R$="Y" THEN
        KCONF$ = ""
        FOR I=0 TO 15
            K$=MID$(KORIG$,I+1,1)
            KEY = INSTR("0123456789ABCDEF", K$)-1
            CALL PRINTKEY
            QUESTION$ = "KEY "+K$+" ? (CONFIG:"+KCONF$+") "
            GOSUB QUESTION
            KCONF$ = KCONF$+R$
        NEXT I
    END IF
    CLS
GOTO INIT

SAVEDISK:
    'SAVE TO DISK
    CLS
    SPRITE OFF
    FILES
    PC=RAM+$200
    PAL 0

    QUESTION$ = "SAVE ON EXTERNAL ROM NUMBER?"
    GOSUB PRINTFILES
    GOSUB QUESTION

    IF R$="" THEN 
        CLS
        GOTO INIT
    END IF

    RNUM = R
    
    QUESTION$ = "SAVED ROM NAME?"
    GOSUB PRINTFILES
    GOSUB QUESTION
    
    IF RNUM>=0 AND RNUM<=15 AND R$<>"" THEN
        SAVE RNUM, R$, PC, $800
    END IF
    CLS
GOTO INIT

LOADROM:
    'LOAD FROM ROMS
    CLS
    SPRITE OFF
    FILES
    PC=RAM+$200
    PAL 0

    QUESTION$ = "LOAD ROM NUMBER ?"
    GOSUB PRINTROMS
    GOSUB QUESTION

    IF R>=0 AND R<=NBGAMES THEN
        GOSUB CLEARRAM
        
        LAST = LASTLINE
        IF R<NBGAMES THEN LAST = GAME(R+1)

        TRACE GAMEROM+GAME(R)*16, (LAST-GAME(R))*16

        'LOAD ROM
        COPY GAMEROM+GAME(R)*16, (LAST-GAME(R))*16 TO PC
    END IF
    CLS
GOTO INIT

LOADEXTROM:
    'LOAD FROM EXT DISK ROMS
    CLS
    SPRITE OFF
    FILES
    PC=RAM+$200
    PAL 0

    QUESTION$ = "LOAD EXT ROM NUMBER ? "
    GOSUB PRINTFILES
    GOSUB QUESTION

    IF R>=0 AND R<=15 THEN
        GOSUB CLEARRAM

        'LOAD ROM
        LOAD R, PC
    END IF
    CLS
GOTO INIT


STEPMODE:
    'SPACE
    IF K$ = " " THEN CALL DOCYCLE
    'UP
    IF K = 20 THEN 
        ADD PC, -2
        CALL PRINTRAM
    END IF
    'DOWN
    IF K = 19 THEN 
        ADD PC, +2
        CALL PRINTRAM
    END IF
    'ENTER
    IF K = 10 THEN MODE=1
    'BACKSOACE
    IF K = 8 THEN MODE=2
RETURN

EDITRAM:
    K=0
    I=0
    WHILE K<>8
        K$=""
        K=0
        K$=INKEY$
        IF K$ <> "" THEN K = ASC(K$)
        'CURSOR NAVIGATION         
        'RIGHT
        IF K=17 THEN ADD I, +1, 0 TO 3
        'LEFT
        IF K=18 THEN ADD I, -1, 0 TO 3
        'UP
        IF K=20 THEN ADD PC, -2
        'DOWN
        IF K=19 THEN ADD PC, +2

        'INSERT 
        IF K$="I" THEN
            COPY PC, RAM+RAMSIZE-PC-2 TO PC+2
            POKE PC, 0
            POKE PC+1, 0
        END IF

        'DELETE
        IF K$="X" THEN 
            COPY PC+2, RAM+RAMSIZE-PC-4 TO PC
        END IF

        'BYTE MODIF
        B=-1
        IF (K>=65 AND K<=70) THEN B=K-55
        IF (K>=48 AND K<=57) THEN B=K-48
        IF B>=0 THEN
            POS = 2^(((I+1) MOD 2)*4)
            MASK = $FF AND NOT ($F * POS)
            'TRACE HEX$(PC+I\2, 4), HEX$(MASK, 4)
            BYTE = PEEK(PC+I\2) AND MASK
            POKE PC+I\2, BYTE OR B*POS
            ADD I, +1
            IF I>3 THEN
                I=0
                ADD PC, +2
            END IF
        END IF
        CALL PRINTRAM
        SPRITE 63, 23+I*4, 24, 17
        WAIT VBL
    WEND
    MODE = 0
    SPRITE OFF 63
    CALL PRINTRAM
RETURN

SUB CLEARSCREEN(BYTE)
    FILL $8000+16*CHRSCREEN, RESOX/8*RESOY/8*16, BYTE
END SUB

SUB PRINTRAM
    'PRINT LOCAL RAM
    IF MODE=_POWER THEN EXIT SUB
    I=PC-6
    J=1
    WHILE I<PC+12
        
        'PRINT POINTER
        IF I=PC THEN
            PAL 1
            IF MODE = _EDIT THEN PAL 5
            CALL MICRO(0, J, " >")
        END IF

        'PRINT BYTES
        PAL 0
        OP = PEEK(I)*256 OR PEEK(I+1)
        CALL MICRO(1, J, HEX$(I AND $0FFF,3)+"-"+HEX$(OP, 4))

        
        'PRINT OP NAME
        S$ = "                  "
        IF  OP>0 AND SHOWNAMES AND MODE<>_PLAY THEN
            CALL GETNAME(OP)
            IF LEN(NAME$)>0 THEN S$ = "-" + NAME$ +"                  "
        END IF
        S$ = LEFT$(S$, 13)
        PAL 4
        CALL MICRO(5, J, S$)

        'NEXT RAM ROW
        INC J
        ADD I, 2
    WEND
    PAL 0
END SUB

SUB PRINTALL
    'INITIAL PRINTS
    CALL PRINTTITLES
    PAL 0
    CALL PRINTRAM
    FOR I=0 TO 15
        CALL PRINTVF(I)
        CALL PRINTSTACK(I)
    NEXT I
    CALL PRINTOTHER
END SUB 

SUB PRINTTITLES
    IF MODE=_POWER THEN EXIT SUB
    PAL 1
    CALL MICRO(1, 11, "REG ")
    CALL MICRO(8, 11, "STACK ")
    CALL MICRO(1, 0, "ADR RAM ")
END SUB

SUB PRINTVF(I)
    PAL 0
    IF MODE=_POWER THEN EXIT SUB
    IF I<=7 THEN
        CALL MICRO(1, 12+I, "V"+HEX$(I,1)+"-"+HEX$(V(I),2)+" ")
    ELSE 
        CALL MICRO(4, 4+I, "V"+HEX$(I,1)+"-"+HEX$(V(I),2)+" ")
    END IF
END SUB

SUB PRINTOTHER
    PAL 0
    IF MODE=_POWER THEN EXIT SUB
    CALL MICRO(16, 12, "I-"+HEX$(IREG AND $0FFF,3)+" ") 
    CALL MICRO(16, 14, "DT-"+HEX$(DT,2)+" ")
    CALL MICRO(16, 16, "ST-"+HEX$(ST,2)+" ")
END SUB


SUB GETKEY(K$)
    IF K$<>"" THEN
        I = INSTR(KCONF$, K$)
        IF I<>0 THEN 
            KEY=-1
            K = ASC(MID$(KORIG$, I, 1))
            'A-Z
            IF (K>=65 AND K<=70) THEN KEY=K-55
            '0-9
            IF (K>=48 AND K<=57) THEN KEY=K-48
            LASTKEY=KEY
        END IF
    ELSE    
        KEY=-1
    END IF
    CALL PRINTKEY
END SUB

SUB PRINTKEY
    'IF MODE=_POWER THEN EXIT SUB
    'COPY KEYPAD
    BG COPY 0, 0, 5, 5 TO 12,6

    'CIRCLE THE KEY
    IF KEY>=0 THEN 
        I = INSTR(KORIG$, HEX$(KEY,1))
        SPRITE 40, 101+((I-1) MOD 4)*8, 42+(I-1)\4*6, 41 
    ELSE IF TIMER MOD 10 = 0 THEN
        SPRITE OFF 40
    END IF
END SUB

SUB PRINTSTACK(I)
    IF MODE=_POWER THEN EXIT SUB
    IF SP=I THEN
        S$=">"
    ELSE 
        S$=" "
    END IF
    IF I<=7 THEN
        CALL MICRO(7, 12+I, S$+"S"+HEX$(I,1)+"-"+HEX$(STACK(I),3)+" ")
    ELSE
        CALL MICRO(11, 4+I, S$+"S"+HEX$(I,1)+"-"+HEX$(STACK(I),3)+" ")
    END IF
END SUB

SUB DRAWCHAR(PX, PY, CH)
    ADDR = ROM(4) + 5*CH
    FOR I=0 TO 4
        CALL DRAWBYTE(PX, PY+I, PEEK(ADDR+I))
    NEXT I
END SUB

SUB DRAWBYTE(PX, PY, BYTE)
    PX = PX MOD RESOX
    PY = PY MOD RESOY
    CX = PX\8
    CY = PY\8
    NUMC = CHRSCREEN+CX+CY*RESOX\8
    PPX = PX MOD 8
    PPY = PY MOD 8
    ADDR = $8000+16*NUMC+PPY+8

    'THEN FIRST BITS
    B = BYTE\(2^PPX) AND $FF
    BIT = PEEK(ADDR) XOR B

    'COLLISION DETECT
    HITTING = (BIT AND B) = B AND B>0
    'TRACE BIN$(BIT,8), BIN$(B,8)
    POKE ADDR, BIT

    'IF ONE BYTE IS ON 2 CELLS  
    IF PPX > 0 THEN
        ADDR = $8000+16*(NUMC+1)+PPY+8
        IF CX=RESOX\8-1 THEN ADD ADDR, -16*RESOX\8
        
        'THE REMAINING BITS
        B = BYTE*(2^(8-PPX)) AND $FF

        'XOR THE BYTE TO DRAW IT
        BIT = PEEK(ADDR) XOR B
        'TRACE BIN$(BIT,8), BIN$(B,8)
        
        'COLLISION DETECT
        HITTING = HITTING OR (((BIT AND B) = B) AND (B>0))
        POKE ADDR, BIT
    END IF
    'TRACE HITTING
END SUB

SUB INITSCREEN(RULLERS)
    PAL PALSCREEN
    C = CHRSCREEN
    S = 1
    FOR J=0 TO RESOY/8-1
        FOR I=0 TO RESOX/8-1
       
            CX = 20-(RESOX/8-I+1)
            CY = 1+J

            'SCREEN CELLS
            SPRITE S, CX*8, CY*8, C
            INC C
            INC S

        NEXT I
    NEXT J
    CALL CLEARSCREEN($FF)
END SUB

SUB MICROPHONE(CX, CY, T$, ALLOWED$)
    CALL MICRO(CX, CY, T$)
    PRINT("")
    INPUT " ";OUT$
    CALL MICRO(CX, CY, LEFT$("                                  ", LEN(T$)+1))
END SUB

SUB MICRO(CX, CY, T$)
    
    CX0 = CX
    'IF TIMER MOD 2 = 0 THEN
    L=LEN(T$)
    BG 1
    FOR I=1 TO L\2
        C$=MID$(T$,I*2,1)
        TEXT CX,CY,C$
        INC CX
    NEXT I
    'ELSE IF TIMER MOD 2 = 1 THEN
    
    CX=CX0
    L=LEN(T$)
    BG 0 
    FOR I=1 TO L\2
        C$=MID$(T$,I*2-1,1)
        TEXT CX,CY,C$
        INC CX
    NEXT I  
    CX=CX0
    'END IF
END SUB


SUB MICROROWS
'HANDLES WHAT ROW IS BEING DRAWN
'AND WHERE THE NEXT CHARACTER IS DISPLAYED
'Y     : Y POSITION
  Y=(RASTER\6)*2-1
  SCROLL 0,0,Y
  'HERE'S THE OTHER PART OF THE MAGIC...MOVE BACKGROUND
  'TO OVERPRINT THE CHARACTER.
  SCROLL 1,-4,Y
END SUB


SUB DOCYCLE
    'FETCH THE NEXT 2 BYTES
    OP = PEEK(PC)*256 OR PEEK(PC+1)
    'FIRST BYTE
    O = $F000 AND OP
    'RIGHT BYTES
    P = $0FFF AND OP

    FL = $F00F AND OP

    'MID BYTES
    X = ($0F00 AND OP) / 256
    Y = ($00F0 AND OP) / 16

    'TWO LAST BYTES
    K = $00FF AND OP

    'END BYTE
    E = $000F AND OP

    'INCREMENT POINTER
    ADD PC, 2

    'EXECUTE CPU INSTRUCTION
    IF OP = $00E0 THEN
        '00E0 - CLS
        CALL CLEARSCREEN($FF)
    ELSE IF OP = $00EE THEN
        '00EE - RET
        PC=RAM+STACK(SP)
        DEC SP
        CALL PRINTSTACK(SP)
        CALL PRINTSTACK(SP+1)
    ELSE IF O = $1000 THEN
        '1NNN - JP ADDR
        PC = RAM+P
    ELSE IF O = $2000 THEN
        '2NNN - CALL ADDR
        INC SP
        STACK(SP) = PC AND $0FFF
        PC = RAM OR P
        CALL PRINTSTACK(SP)
        CALL PRINTSTACK(SP-1)
    ELSE IF O = $3000 THEN
        '3XKK - SE VX, BYTE
        IF V(X) = K  THEN ADD PC, 2
    ELSE IF O = $4000 THEN
        '4XKK - SNE VX, BYTE
        IF V(X) <> K THEN ADD PC, 2
        CALL PRINTVF(X)
    ELSE IF O = $5000 THEN
        '5XY0 - SE VX, VY
        IF V(X) = V(Y) THEN ADD PC, 2
    ELSE IF O = $6000 THEN
        '6XKK - LD VX, BYTE
        V(X) = K
        CALL PRINTVF(X)
    ELSE IF O = $7000 THEN
        '7XKK - ADD VX, BYTE
        V(X) = (V(X)+K) AND $FF
        CALL PRINTVF(X)
    ELSE IF FL = $8000 THEN
        '8XY0 - LD VX, VY
        V(X) = V(Y)
        CALL PRINTVF(X)
    ELSE IF FL = $8001 THEN
        '8XY1 - OR VX, VY
        V(X) = V(X) OR V(Y)
        CALL PRINTVF(X)
    ELSE IF FL = $8002 THEN
        '8XY2 - AND VX, VY
        V(X) = V(X) AND V(Y)
        CALL PRINTVF(X)
    ELSE IF FL = $8003 THEN
        '8XY3 - XOR VX, VY
        V(X) = V(X) XOR V(Y)
        CALL PRINTVF(X)
    ELSE IF FL = $8004 THEN
        '8XY4 - ADD VX, VY
        S = V(X) + V(Y)
        IF S>$FF THEN 
            V($F) = 1
        ELSE
            V($F) = 0
        END IF
        V(X) = S AND $FF
        CALL PRINTVF(X)
        CALL PRINTVF($F)
    ELSE IF FL = $8005 THEN
        '8XY5 - SUB VX, VY
        S = V(X) - V(Y)
        IF V(X)<V(Y) THEN 
            V($F) = 0
        ELSE
            V($F) = 1
        END IF
        V(X) = ABS(S) AND $FF
        CALL PRINTVF(X)
        CALL PRINTVF($F)
    ELSE IF FL = $8006 THEN
        '8XY6 - SHR VX
        V($F) = ABS((V(X) AND %00010000) <> 0)
        V(X) = ((V(X)/2) AND %11110111)
        CALL PRINTVF(X)
        CALL PRINTVF($F)
    ELSE IF FL = $8007 THEN
        '8XY7 - SUBN VX, VY
         S = V(Y) - V(X)
        IF V(Y)<V(X) THEN 
            V($F) = 0
         ELSE
            V($F) = 1
        END IF
        V(X) = ABS(S) AND $FF
        CALL PRINTVF(X)
        CALL PRINTVF($F)
    ELSE IF FL = $800E THEN
        '8XYE - SHL VX
        V($F) = ABS((V(X) AND %00001000) <> 0)
        V(X) = ((V(X)*2) AND %11101111)
        CALL PRINTVF(X)
        CALL PRINTVF($F)
    ELSE IF FL = $9000 THEN
        '9XY0 - SNE VX, VY
        IF V(X) <> V(Y) THEN ADD PC, 2
    ELSE IF O = $A000 THEN
        'ANNN - LD I, ADDR
        IREG = RAM + P
        CALL PRINTOTHER
    ELSE IF O = $B000 THEN
        'BNNN - JP V0, ADDR
        PC = P + V(0)
    ELSE IF O = $C000 THEN
        'CXKK - RND VX, BYTE
        V(X) = RND(255) AND K
        CALL PRINTVF(X)
    ELSE IF O = $D000 THEN
        'DXYN - DRW VX, VY, NIBBLE
        V($F)=0
        FOR I=0 TO E-1
            B = PEEK(IREG+I)
            HITTING = 0
            CALL DRAWBYTE(V(X), V(Y)+I, B)
            IF HITTING THEN V($F) = 1
        NEXT I
        V($F) = ABS(V($F))
        TRACE V($F)
        CALL PRINTVF($F)
    ELSE IF O = $E000 AND K = $9E THEN
        'EX9E - SKP VX
        IF LASTKEY = V(X) THEN
            ADD PC, 2
            'LASTKEY=-1
        END IF
    ELSE IF O = $E000 AND K = $A1 THEN
        'EXA1 - SKNP VX
        IF LASTKEY <> V(X) THEN 
            ADD PC, 2
            'LASTKEY=-1
        END IF
    ELSE IF O = $F000 AND E = $7 THEN
        'FX07 - LD VX, DT
        V(X) = DT
        CALL PRINTVF(X)
    ELSE IF O = $F000 AND K = $0A THEN
        'FX0A - LD VX, K
        KEY=-1
        'COPY KEYPAD
    
        CALL MICRO(17, 8, "PRESS ")   
        CALL MICRO(17, 9, " KEY ")   
        K$=""
        K=0
        WHILE KEY=-1 AND INSTR("?,.;+P",K$)=0 AND K<>10
            'KEYPAD
            K$ = INKEY$
            CALL GETKEY(K$)
            WAIT VBL
        WEND
        V(X) = KEY
        CALL PRINTVF(X)
        CALL MICRO(17, 8, "      ")   
        CALL MICRO(17, 9, "      ")  
    ELSE IF O = $F000 AND K = $15 THEN
        'FX15 - LD DT, VX
        DT=V(X)
        CALL PRINTOTHER
    ELSE IF O = $F000 AND K = $18 THEN
        'FX18 - LD ST, VX
        V(X) = ST
        CALL PRINTVF(X)
    ELSE IF O = $F000 AND K = $1E THEN
        'FX1E - ADD I, VX
        IREG=IREG+V(X)
        CALL PRINTOTHER
    ELSE IF O = $F000 AND K = $29 THEN
        'FX29 - LD F, VX
        IREG = RAM+V(X)*5
        CALL PRINTOTHER
    ELSE IF O = $F000 AND K = $33 THEN
        'FX33 - LD B, VX
        S$ = STR$(V(X))
        POKE IREG,   VAL(MID$(S$, 1, 1))
        POKE IREG+1, VAL(MID$(S$, 2, 1))
        POKE IREG+2, VAL(MID$(S$, 3, 1))

    ELSE IF O = $F000 AND K = $55 THEN
        'FX55 - LD [I], VX
        FOR I=0 TO X
            POKE IREG+I, V(I)
        NEXT I
        IREG = IREG + X + 1
        CALL PRINTOTHER
    ELSE IF O = $F000 AND K = $65 THEN
        'FX65 - LD VX, [I]
         FOR I=0 TO X
            V(I) = PEEK(IREG+I)
            CALL PRINTVF(I)
        NEXT I
        IREG = IREG + X + 1
        CALL PRINTOTHER
    ELSE
        'TRACE "OP "+HEX$(OP, 4)+" UNKNOWN"
    END IF

    CALL PRINTRAM
    INC CYCLES
    IF CYCLES MOD CYCLEPERVBL = 0 THEN
        WAIT VBL
    END IF
END SUB

SUB UPDATECLOCK
     'UPDATE CLOCKS
    IF DT>0 THEN 
        DEC DT
        CALL PRINTOTHER
    END IF
    IF ST>0 THEN
        PLAY 0, 42, 0  
        DEC ST
        CALL PRINTOTHER
    END IF
END SUB

SUB GETNAME(OP)
    NAME$=""
    'FIRST BYTE
    O = $F000 AND OP
    'RIGHT BYTES
    P = $0FFF AND OP

    FL = $F00F AND OP

    'MID BYTES
    X = ($0F00 AND OP) / 256
    Y = ($00F0 AND OP) / 16

    'TWO LAST BYTES
    K = $00FF AND OP

    'END BYTE
    E = $000F AND OP

    IF OP = $00E0 THEN
        NAME$ = "CLS"
    ELSE IF OP = $00EE THEN
        NAME$ = "RET"
    ELSE IF O   = $1000 THEN
        NAME$ = "JP "+HEX$(P,3)
    ELSE IF O   = $2000 THEN
        NAME$ = "CALL "+HEX$(P,3)
    ELSE IF O   = $3000 THEN
        NAME$ = "SE V"+HEX$(X,1)+","+HEX$(K,2)
    ELSE IF O   = $4000 THEN
        NAME$ = "SNE V"+HEX$(X,1)+","+HEX$(K,2)
    ELSE IF O = $5000 THEN
        NAME$ = "SE V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF O = $6000 THEN
        NAME$ = "LD V"+HEX$(X,1)+","+HEX$(K,2)
    ELSE IF O = $7000 THEN
        NAME$ = "ADD V"+HEX$(X,1)+","+HEX$(K,2)
    ELSE IF FL = $8000 THEN
        NAME$ = "LD V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $8001 THEN
        NAME$ = "OR V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $8002 THEN
        NAME$ = "AND V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $8003 THEN
        NAME$ = "XOR V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $8004 THEN
        NAME$ = "ADD V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $8005 THEN
        NAME$ = "SUB V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $8006 THEN
        NAME$ = "SHR V"+HEX$(X,1)+"{,V"+HEX$(Y,1)+"}"
    ELSE IF FL = $8007 THEN
        NAME$ = "SUBN V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF FL = $800E THEN
        NAME$ = "SHL V"+HEX$(X,1)+"{,V"+HEX$(Y,1)+"}"
    ELSE IF FL = $9000 THEN
        NAME$ = "SNE V"+HEX$(X,1)+",V"+HEX$(Y,1)
    ELSE IF O = $A000 THEN
        NAME$ = "LD I, "+HEX$(P, 3)
    ELSE IF O = $B000 THEN
        NAME$ = "JP V0, "+HEX$(P, 3)
    ELSE IF O = $C000 THEN
        NAME$ = "RND V"+HEX$(X,1)+","+HEX$(K,2)
    ELSE IF O = $D000 THEN
        NAME$ = "DRW V"+HEX$(X,1)+",V"+HEX$(Y,1)+","+HEX$(E,1)
    ELSE IF O = $E000 AND K = $9E THEN
        NAME$ = "SKP V"+HEX$(X,1)+""
    ELSE IF O = $E000 AND K = $A1 THEN
        NAME$ = "SKNP V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND E = $7 THEN
        NAME$ = "LD V"+HEX$(X,1)+",DT"
    ELSE IF O = $F000 AND K = $0A THEN
        NAME$ = "LD V"+HEX$(X,1)+",K"
    ELSE IF O = $F000 AND K = $15 THEN
        NAME$ = "LD DT, V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND K = $18 THEN
        NAME$ = "LD ST, V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND K = $1E THEN
        NAME$ = "ADD I, V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND K = $29 THEN
        NAME$ = "LD F, V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND K = $33 THEN
        NAME$ = "LD B, V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND K = $55 THEN
        NAME$ = "LD [I], V"+HEX$(X,1)+""
    ELSE IF O = $F000 AND K = $65 THEN
        NAME$ = "LD V"+HEX$(X,1)+",[I]"
    END IF

'- 00E0 - CLS
'- 00EE - RET
'- 0NNN - SYS ADDR
'- 1NNN - JP ADDR
'- 2NNN - CALL ADDR
'- 3XKK - SE VX, BYTE
'- 4XKK - SNE VX, BYTE
'- 5XY0 - SE VX, VY
'- 6XKK - LD VX, BYTE
'- 7XKK - ADD VX, BYTE
'- 8XY0 - LD VX, VY
'- 8XY1 - OR VX, VY
'- 8XY2 - AND VX, VY
'- 8XY3 - XOR VX, VY
'- 8XY4 - ADD VX, VY
'- 8XY5 - SUB VX, VY
'- 8XY6 - SHR VX {, VY}
'- 8XY7 - SUBN VX, VY
'- 8XYE - SHL VX {, VY}
'- 9XY0 - SNE VX, VY
'- ANNN - LD I, ADDR
'- BNNN - JP V0, ADDR
'- CXKK - RND VX, BYTE
'- DXYN - DRW VX, VY, NIBBLE
'- EX9E - SKP VX
'- EXA1 - SKNP VX
'- FX07 - LD VX, DT
'- FX0A - LD VX, K
'- FX15 - LD DT, VX
'- FX18 - LD ST, VX
'- FX1E - ADD I, VX
'- FX29 - LD F, VX
'- FX33 - LD B, VX
'- FX55 - LD [I], VX
'- FX65 - LD VX, [I]
END SUB
    
#1:MAIN PALETTES
153F2F0000383400003C0C00003F3C00
002A091500302A30003F2A1500302A00

#2:MAIN CHARACTERS
00000000000000000000000000000000
0000000000000000FFFFFFFFFFFFFFFF
D5000000000000007F00000000000000
80800080008000800080808080808080
04040404040407070404040404040707
44C44444E404FFFF040404040404FFFF
E424E484E404FFFF040404040404FFFF
E4246424E404FFFF040404040404FFFF
648484846404FCFC040404040404FCFC
00000000000000070000000000000007
00000000000000FF00000000000000FF
00000000000000FC00000000000000FC
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
D88800000088D800D88800000088D800
00000000000000000000000000000000
00000000000000000000000000000000
04040404040407070404040404040707
A4A4E4242404FFFF040404040404FFFF
E484E424E404FFFF040404040404FFFF
E484E4A4E404FFFF040404040404FFFF
C4A4A4A4C404FCFC040404040404FCFC
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
04040404040407070404040404040707
E42424242404FFFF040404040404FFFF
E4A4E4A4E404FFFF040404040404FFFF
E4A4E4242404FFFF040404040404FFFF
E484C484E404FCFC040404040404FCFC
FF8080808080FF00FF8080808080FF00
80808080808080008080808080808000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
04040404040404070404040404040407
44A4E4A4A404FFFF040404040404FFFF
E4A4A4A4E404FFFF040404040404FFFF
C4A4C4A4C404FFFF040404040404FFFF
E484C4848404FCFC040404040404FCFC
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
40404000400000000000000000000000
A0A00000000000000000000000000000
A0E0A0E0A00000000000000000000000
40E040E0400000000000000000000000
A0204080A00000000000000000000000
0040E040000000000000000000000000
40400000000000000000000000000000
20404040200000000000000000000000
80404040800000000000000000000000
00A040A0000000000000000000000000
0040E040000000000000000000000000
00000040400000000000000000000000
0000E000000000000000000000000000
00000000400000000000000000000000
20204080800000000000000000000000
E0A0A0A0E00000000000000000000000
40C04040E00000000000000000000000
E020E080E00000000000000000000000
E0206020E00000000000000000000000
A0A0E020200000000000000000000000
E080E020E00000000000000000000000
E080E0A0E00000000000000000000000
E0202020200000000000000000000000
E0A0E0A0E00000000000000000000000
E0A0E020200000000000000000000000
00400040000000000000000000000000
00400040800000000000000000000000
20408040200000000000000000000000
00E000E0000000000000000000000000
80402040800000000000000000000000
C0204000400000000000000000000000
608060A0C00000000000000000000000
40A0E0A0A00000000000000000000000
C0A0C0A0C00000000000000000000000
60808080600000000000000000000000
C0A0A0A0C00000000000000000000000
E080C080E00000000000000000000000
E080C080800000000000000000000000
6080A0A0600000000000000000000000
A0A0E0A0A00000000000000000000000
E0404040E00000000000000000000000
E0202020C00000000000000000000000
A0A0C0A0A00000000000000000000000
80808080E00000000000000000000000
E0E0A0A0A00000000000000000000000
C0A0A0A0A00000000000000000000000
40A0A0A0400000000000000000000000
C0A0C080800000000000000000000000
40A0A0A0600000000000000000000000
C0A0C0A0A00000000000000000000000
60804020C00000000000000000000000
E0404040400000000000000000000000
A0A0A0A0600000000000000000000000
A0A0A0A0400000000000000000000000
A0A0A0E0E00000000000000000000000
A0A040A0A00000000000000000000000
A0A06020C00000000000000000000000
E0204080E00000000000000000000000
60404040600000000000000000000000
80804020200000000000000000000000
C0404040C00000000000000000000000
40A00000000000000000000000000000
00000000E00000000000000000000000

#3:MAIN BG
0000141009000A000A000A000B000000
00000000000000000000000000000000
00000000000000000000000004000500
06000700080000000000000000000000
00000000000000000000000000000000
00000000140015001600170018000000
00000000000000000000000000000000
00000000000000000000000024002500
26002700280000000000000000000000
00000000000000000000000000000000
00000000340035003600370038000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000

#4:CHIP8 FONT
F0909090F02060202070F010F080F0F0
10F010F09090F01010F080F010F0F080
F090F0F010204040F090F090F0F090F0
10F0F090F09090E090E090E0F0808080
F0E0909090E0F080F080F0F080F08080

#5:GAMES
00000000000000000000000000000000
00E06C004C006E0FA2036020F05500E0
22BE2276228E225E2246121061006217
6304411000EEA2E8F11EF06540001234
F029D235710172056403841234001222
621773061222640384E2650385D29450
00EE440300EE640184E422A612466403
84E2650385D2945000EE440000EE64FF
84E422A6125E640C84E2650C85D29450
00EE440000EE64FC84E422A61276640C
84E2650C85D2945000EE440C00EE6404
84E422A6128EA2E8F41EF065A2E8FE1E
F0556000A2E8F41EF0558E4000EE3C00
12D2221C22D8221CA2F8FD1EF0658D00
00EE7CFFCD0F00EE7D01600F8D02ED9E
12D8EDA112E200EE0102030405060708
090A0B0C0D0E0F000D00010204050608
090A0C0E03070B0F84E422A61276640C
84E2650C85D2945000EE440C00EE6404
84E422A6128EA2E8F41EF065A2E8FE1E
F0556000A2E8F41EF0558E4000EE3C00
12D2221C22D8221CA2F8FD1EF0658D00
00EE7CFFCD0F00EE7D01600F8D02ED9E
12D8EDA112E200EE0102030405060708
090A0B0C0D0E0F000D00010204050608
00000000000000000000000000000000
121A322E303020432E20456765626572
672031382F382D27393180038113A8C8
F1556005A8CCF05587738663277200E0
27946E4087E26E2787E1681A690C6A38
6B006C026D1A2750A8EDDAB4DCD423D0
3E00127CA8CCF0658500C4FF845224F6
C4FF8452261E6001E0A127D636F7124E
8E60287A6E64287A27D6122AF0074000
13108080800681A0810680154000129A
4001129A40FF129A12C88090800681B0
81068015400012B2400112B240FF12B2
12C8A8EDDAB46A386B00DAB46EF387E2
6E0487E16E32287A8080800681C08106
8015400012E0400112E040FF12E01254
8090800681D081068015400012F84001
12F840FF12F81254A8EDDCD46C026D1A
DCD46ECF87E26E2087E16E19287A1254
603F28A82750A8EDDAB4DCD46E4087E3
807080E2300012328E60287A288A00E0
6611670AA8CA27E666116710A8C827E6
640065086600670FAB19D469AB22D569
600328A83E0013C6AB19D469AB22D569
7402750234301348AB19D469AB22D569
600328A83E0013C6AB19D469AB22D569
760236161368AB19D469AB22D5696003
28A83E0013C6AB19D469AB22D56974FE
75FE34001386AB19D469AB22D5696003
28A83E0013C6AB19D469AB22D56976FE
360013A61348AB22D569AB2BD569121A
83706E0383E2848085906E06EEA11432
6E03EEA1144A6E08EEA114626E07EEA1
147A43037502430075FE430274024301
74FE8040815027BA82006E0880E23000
14926E07802082E24205149A420614B2
420714EC27506EFC87E2873188408950
175080408150710227BA82006E0880E2
300013F263037502140E8040815071FE
27BA82006E0880E2300013F2630075FE
140E80408150700227BA82006E0880E2
300013F263027402140E8040815070FE
27BA82006E0880E2300013F2630174FE
140E2750D8948EF000EE6EF080E28031
F055A8F1D45476016105F0074000F118
14246EF080E28031F055A8F5D4547604
80A081B027BA6EF080E2300014D26E0C
87E380C081D027BA6EF080E2300014E4
6E3087E360FFF018F01514244301643A
430264001424827083706E0C82E280A0
81B027BAA8ED6EF080E230001524DAB4
420C7B0242007BFE42087A0242047AFE
DAB400EE6E80F107310015D4340015D4
8100830E3F001556839083B54F00158C
3300157487E3838083A54F0015BC3300
15A487E315D4838083A54F0015BC3300
15A487E3839083B54F00158C33001574
87E315D463408132410015D4DAB47B02
DAB46EF387E2620C872100EE63108132
410015D4DAB47BFEDAB46EF387E26200
872100EE63208132410015D4DAB47A02
DAB46EF387E26208872100EE63808132
410015D4DAB47AFEDAB46EF387E26204
872100EEC1F08012300015E46E0C87E3
82E3150EDAB4800E4F0015F262047AFE
1614800E4F0015FE620C7B021614800E
4F00160A62087A021614800E4F0015DC
62007BFEDAB46EF387E2872100EE8270
83706E3082E280C081D027BAA8ED6EF0
80E23000164CDCD442307D0242007DFE
42207C0242107CFEDCD400EE6E80F107
31001704340017048100830E4F00167E
839083D54F0016B63300169C87E38380
83C54F0016EA330016D087E317048380
83C54F0016EA330016D087E3839083D5
4F0016B63300169C87E3170463408132
41001704DCD47D02DCD487E36ECF87E2
6230872100EE6310813241001704DCD4
7DFEDCD487E36ECF87E26200872100EE
6320813241001704DCD47C02DCD487E3
6ECF87E26220872100EE638081324100
1704DCD47CFEDCD487E36ECF87E26210
872100EEC1F080123000171687E36E30
87E382E31636DCD4800E4F0017246290
7CFE1746800E4F00173062307D021746
800E4F00173C62A07C021746800E4F00
170C62007DFEDCD46E4F87E2872100EE
80706E0380E2800E818081946E0281E2
41007001800E800EA8CDF01ED8948EF0
00EE6E00A919FE1EFE1EFE1EFE1EF365
AB34FE1EFE1EFE1EFE1EF3557E013E80
177400EE822383336E0F8020813027BE
80E2800EA8F9F01ED23272023240179A
82237302432000EE179A700271028006
8106810E810E810E810EAB34F11EF11E
F01EF06500EEA8CCF0658006F0556001
E0A117E000EEF1656E01844382008310
651083554F0082E54F00180C65278255
4F00180C8020813084E417F0F429D675
760684438200831065E883554F0082E5
4F001834650382554F00183480208130
84E41818F429D6757606844382008310
656483554F0082E54F00185480208130
84E41840F429D6757606844382008310
650A83554F00186E813084E41860F429
D6757606F129D67500EEA8C8F16581E4
3F007001A8C8F15500EEA8C8F3658E00
8E254F0000EE3E0018A28E108E354F00
00EEA8CAF15500EE8EE3620F63FF6110
E2A118C48134310018B0611080343000
18B000EE6E0100EE0000000005005070
20005070200060306000603060003060
30003060300020705000207050002070
70000020000000000000000000000000
000000800000000000C0000000808000
00C0808080C00080000C080808080808
08080808080808080D0C080808080808
08080808080808080D0A6505050505E5
0505E505050505C50A0A6505050505E5
0505E505050505C50A0A050C08080F05
0C0D050808080D050E0F050C08080F05
0C0D050808080D050A0A050A65060595
0A0A350505C50A350505950A65050595
0A0A350506C50A050A0A050F05080808
08080C080F0508080808080F0508080C
080808080F050F050A0A7505B5050505
05C50A6505B505E50505E505B505C50A
6505050505B505D50A0A050C08080808
0D050F050C080F05080F0508080D050F
050C080808080D050A0F050F650505C5
0A35E5950A6505B00505B505C50A35E5
950A650505C50F050F077405D5080F05
0E0F05080F050C080808080D05080F05
080F05080F7505D4070A050A350505F5
0505B50505D508080D0C080F750505B5
0505F50505950A050A0A050808080D05
0C0808080D3505C50A0A6505950C0808
080D050C08080F050A0A750506C50A05
0808080808080F05080F050808080808
080F050A650605D50A0A050C0D050A35
05050505E50505F50505F50505E50505
0505950A050C0D050A0A05080F050808
0808080F050C0D05080F050C0D050808
0808080F05080F050A0A350505B50505
05050505950A0A350505950A0A350505
05050505B50505950A08080808080808
08080808080F08080808080F08080808
08080808080808080F3C429999423C01
100F7884323284780010E078FCFEFE84
780010E0000000000000000000000000
00000000000000000000000000000000
1217424C49545A204279204461766964
2057494E544552A34160046109620E67
04D01EF21E700C30401221F00A00E022
D9F00A00E08E70A31E6B1FCC1F8CC4DC
B23F011249DCB21239CA077A017BFEDC
B27AFF3A00124D7EFF3E0012396B008C
706D006E00A31BDDE33F0012C13B0012
816005E09E12876B0188D0780289E079
03A31ED89181F06005F015F007300012
8B3B0112ABA31E3101D8917901392012
AB6B0031007CFF4C0012BBA31BDDE37D
023D4012B96D007E01126500E0770212
2DA31BDDE360146102620BA320D01BF2
1E7008302C12CD12D7600A610D6205A3
07D015F21E7008302A12E1807070FE80
06A387F033F265602DF129610DD01570
05F229D01500EE83828382FBE8088805
E2BEA0B8203E80808080F880F8FCC0C0
F981DBCBFB00FA8A9A99F8EF2AE82929
006F682E4C8FBEA0B8B0BE00BE223E34
B2D8D800C3C300D8D800C3C300D8D8C0
C000C0C000C0C000C0C000DBDBDBDB00
181800181800181800DBDBDBDB001818
001818001818001818DBDB0003030018
1800C0C000DBDB000000000000000000
00000000000000000000000000000000
6E0565006B066A00A30CDAB17A043A40
12087B023B1212066C206D1FA310DCD1
22F660006100A312D0117008A30ED011
6040F015F00730001234C60F671E6801
69FFA30ED671A310DCD16004E0A17CFE
6006E0A17C02603F8C02DCD1A30ED671
86848794603F8602611F8712471F12AC
46006801463F68FF47006901D6713F01
12AA471F12AA600580753F0012AA6001
F018806061FC8012A30CD07160FE8903
22F6750122F6456012DE124669FF8060
80C53F0112CA610280153F0112E08015
3F0112EE80153F0112E86020F018A30E
7EFF80E080046100D0113E00123012DE
78FF48FE68FF12EE7801480268016004
F01869FF1270A314F533F265F1296337
6400D3457305F229D34500EEE0008000
FC00AA00000000000000000000000000
00000000000000000000000000000000
121A434F4E4E45435434206279204461
7669642057494E544552A2BBF665A2B4
F655690068016B006D0F6E1FA2A5600D
61326200D02FD12F720F321E1234D021
D1217201600AA29FD021D121A29FDDE1
FC0ADDE14C05127E3C04126A7BFF7DFB
3D0A127A6B066D2D127A3C0612987B01
7D053D32127A6B006D0FDDE11250A2B4
FB1EF06540FC12988A0070FBF0558983
A29E3900A2A1DDA4A29FDDE1125060F0
F0609090608080808080808080808080
808080801A1A1A1A1A1A1A1A1A1A1A1A
1A1A0000000000000000000000000000
00000000000000000000000000000000
6E0100E06D016A016B018CD08CE24C00
122088D0223E3A4012206A017B063C3F
7D013D3F120AF00A400589E48EE43E40
12026A1C6B0D889000E0223E123CA294
F833F2652254DAB57A0481202254DAB5
7A0500EE8310833483348314A262F31E
00EEE0A0A0A0E04040404040E020E080
E0E020E020E0A0A0E02020E080E020E0
E080E0A0E0E020202020E0A0E0A0E0E0
A0E020E0000000000000000000000000
00000000000000000000000000000000
121D48494444454E2120312E30204279
2044617669642057494E544552A43F60
006140F155A43F6000F05500E0A47E60
0C6108620FD01F7008F21E30341235F0
0A00E0A4C96013610D6204D0147008F2
1E302B124BA41FFF65A42FFF55634066
08C10FC20FA42FF11EF0658400A42FF2
1EF06585008040F055A42FF11E8050F0
5573FF3300126100E060006100A477D0
1770083020128F600071083120128F6C
006D006E00A43FF0657001F05523B96A
10235D23CD8A9087D088E0235D23CD23
B9A42FF91EF0658100A42FFA1EF06550
10132B23DF6020240123DF6000A42FF9
1EF055A42FFA1EF05576FF360012A5A4
3FF165820080153F00130180208120F1
5500E0A51960106107620ED01F7008F2
1E3030130BA43FF16584108300660924
0B660F8340240BF00A122523DB608024
0123DBA42FFA1EF06570FF23F3A441F0
1ED787A477D787A42FF91EF06570FF23
F3A441F01EDDE7A477DDE712A5A471DD
E7FB0ADDE73B0413714D00135D7DF87C
FF3B06137D4D18135D7D087C013B0213
894E00135D7EF87CFC3B0813954E1813
5D7E087C043B05135DA42FFC1EF06540
00135D89C099A0135D70FFA477DDE7A4
4123F3F01EDDE700EEA4D56024610A62
0BD01B7008F21E303C13C100EE603461
10A4F1D015A4F6D01500EEA4FB13E1A5
0A6024610D6205D0157008F21E303C13
E700EE81008114800480048004801500
EEF015F0073000140300EEA42FF333F2
656523F129D5656528F229D56500EE01
02030408070605050607080403020101
02030408070605050607080403020100
00FEEEC682C6EEFEFEC6C6C6FEFEC6AA
82AAC6FEC6828282C6FEBAD6EED6BAFE
EEEE82EEEEFE82FE82FE82FEAAAAAAAA
AAFEFEFEFEFEFEFEAAD6AAD6AAFE8B88
F8888B0000000000F0484848F2EF8484
84EF0008080A008A8AAAAA523C929292
3C00E2A3E3008BC8A89888FA83E282FA
0028B89000EF888E888F2121A1602100
00000000BC223C28A4898AAB529751D1
51C00000156A8A8E8A6A00648A8E8A6A
44AAAAAA4400CCAACAAAAC6E884C28CE
00040C04040E0C1204081E6394949463
38A5B8A021E101C120C1898A522221CF
282F28C80282020002FF808F908E819E
8091919F919180FF003C4040403C007C
1010107C00FF00008000800000008000
800000FF010101010101010101010101
01FF0000000000000000000000000000
00000000000000000000000000000000
1225535041434520494E564144455253
2076302E392042792044617669642057
494E544552600061006208A3D3D01871
08F21E3120122D700861003040122D69
056C156E002387600AF015F007300012
4B23877E0112456600681C69006A046B
0A6C046D3C6E0F00E0236B2347FD1560
04E09E127D236B380078FF236B6006E0
9E128B236B38397801236B3600129F60
05E09E12E96601651B8480A3CFD451A3
CFD45175FF35FF12AD660012E9D4513F
0112E9D45166008340730383B562F883
226208330012C923738206430812D333
1012D523738206331812DD2373820643
2012E7332812E923733E001307790649
1869006A046B0A6C047DF46E0F00E023
47236BFD15126FF7073700126FFD1523
478BA43B12131B7C026AFC3B0213237C
026A0423473C18126F00E0A4D3601461
08620FD01F7008F21E302C1333F00A00
E0A6F4FE651225A3B7F91E6108235F81
06235F8106235F8106235F7BD000EE80
E080123000DBC67B0C00EEA3CF601CD8
0400EE23478E2323476005F018F015F0
073000137F00EE6A008DE06B04E9A112
57A602FD1EF06530FF13A56A006B046D
016E01138DA500F01EDBC67B087D017A
013A07138D00EE3C7EFFFF99997EFFFF
2424E77EFF3C3C7EDB81423C7EFFDB10
387CFE00007F003F007F000000010101
0303030300003F20202020202020203F
0808FF0000FE00FC00FE0000007E4242
626262620000FF0000000000000000FF
0000FF007D00417D057D7D0000C2C2C6
446C28380000FF0000000000000000FF
0000FF00F71014F7F7040400007C44FE
C2C2C2C20000FF0000000000000000FF
0000FF00EF2028E8E82F2F0000F985C5
C5C5C5F90000FF0000000000000000FF
0000FF00BE00203020BEBE0000F704E7
858584F40000FF0000000000000000FF
0000FF00007F003F007F000000EF28EF
00E0606F0000FF0000000000000000FF
0000FF0000FE00FC00FE000000C000C0
C0C0C0C00000FC0404040404040404FC
1010FFF981B98B9A9AFA00FA8A9A9A9B
99F8E62525F434343400171434373626
C7DF50505CD8D8DF00DF111F121B19D9
7C44FE868686FC84FE8282FEFE80C0C0
C0FEFC82C2C2C2FCFE80F8C0C0FEFE80
F0C0C0C0FE80BE8686FE8686FE868686
1010101010101818184848789C90B0C0
B09C8080C0C0C0FEEE9292868686FE82
868686867C828686867CFE82FEC0C0C0
7C82C2CAC47AFE86FE909C84FEC0FE02
02FEFE10303030308282C2C2C2FE8282
82EE38108686969292EE824438384482
8282FE303030FE021EF080FE00000000
06060000006060C00000000000001818
181800187CC60C1800180000FEFE0000
FE82868686FE080808181818FE02FEC0
C0FEFE021E0606FE84C4C4FE0404FE80
FE0606FEC0C0C0FE82FEFE0202060606
7C44FE8686FEFE82FE06060644FE4444
FE44A8A8A8A8A8A8A86C5A000C18A830
4E7E001218666CA85A66542466004848
1812A80690A812007E3012A884304E72
1866A8A8A8A8A8A8905478A848786C72
A812186C72665490A8722A18A8304E7E
001218666CA87254A85A66187E184E72
A8722A183066A8304E7E006C30544E9C
A8A8A8A8A8A8A848547E18A890547866
A86C2A305AA88430722AA8D8A8004E12
A8E4A2A8004E12A86C2A545472A88430
722AA8DE9CA8722A18A80C54485A7872
1866A8721842426CA8722A0072A8722A
18A8304E7E001218666CA8304E0C6618
006C18A8722A183066A81E54660C189C
A824545412A842780C3CA8AEA8A8A8A8
A8A8A8FF000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
60006380611F620F2232A200F31EF00A
F0554000121C7301330012086380A200
F31EF0654000121C73014300121C2232
121E400272FF400471FF400671014008
7201A2776AE08A126B1F81B23A007201
6AF08A226B0F82B23A0071016B1F81B2
D1218A106B1F8B25DAB16A3F8A15DAB1
8B20DAB100EE01800000000000000000
00000000000000000000000000000000
A21EC2013201A21AD014700430401200
60007104312012001218804020102040
80100000000000000000000000000000
00000000000000000000000000000000
1219204D45524C494E20427920446176
69642057494E54455222F9A31D601061
0022CBA331600B611B22CB640422DF65
00622822C1C2038020A359F51EF05560
176108630183223300700A6302832233
00710AA317D016621422C1D016620522
C1750154501235650060176108A317F3
0A330412796300129733051283700A63
0112973307128D710A63021297330812
69700A710A6303D016621422C1D016A3
59F51EF0657501503012B55540126922
DF7401122D22F9A3456010610E22CB12
BFF215F207320012C300EE83006205D0
15F21E700885307520505012CF00EEA3
59834073FDF333F265F129602B631BD0
357005F229D03500EEA30F60176107D0
18700AD018710AD01870F6D01800EEFF
818181818181FF7E7E7E7E7E7EDBAA8B
CBCBEF088F0DECA0A0B030BE5F5151D9
D983828382FBE8088805E2BEA0B8203E
80808080F8F785B795F576545654563A
2A2A2A39B6A5B6A53500000000000000
00000000000000000000000000000000
12194D495353494C4520627920446176
69642057494E5445526C0C6000610065
08660A67006E01A2ADD0147008304012
296000611CA2B0D014A2B0D0143E0112
49700440386E00124F70FC40006E01D0
14FC15FB073B0012536208E29E12953C
007CFE631B8200A2B0D2316400D23173
FFD2313F0064013303126DD231340112
91770575FF82006300A2ADD234450012
9776FF36001239A2B4F733F265631B64
0DF129D3457305F229D34512AB103838
10387CFE000000000000000000000000
00000000000000000000000000000000
6A026B0C6C3F6D0CA2EADAB6DCD66E00
22D4660368026060F015F0073000121A
C717770869FFA2F0D671A2EADAB6DCD6
6001E0A17BFE6004E0A17B02601F8B02
DAB6600CE0A17DFE600DE0A17D02601F
8D02DCD6A2F0D67186848794603F8602
611F871246021278463F1282471F69FF
47006901D671122A68026301807080B5
128A68FE630A807080D53F0112A26102
80153F0112BA80153F0112C880153F01
12C26020F01822D48E3422D4663E3301
660368FE33016802121679FF49FE69FF
12C87901490269016004F01876014640
76FE126CA2F2FE33F265F12964146500
D4557415F229D45500EE808080808080
80000000000000000000000000000000
00000000000000000000000000000000
22F66B0C6C3F6D0CA2EADAB6DCD66E00
22D4660368026060F015F0073000121A
C717770869FFA2F0D671A2EADAB6DCD6
6001E0A17BFE6004E0A17B02601F8B02
DAB6600CE0A17DFE600DE0A17D02601F
8D02DCD6A2F0D67186848794603F8602
611F871246001278463F1282471F69FF
47006901D671122A68026301807080B5
128A68FE630A807080D53F0112A26102
80153F0112BA80153F0112C880153F01
12C26020F01822D48E3422D4663E3301
660368FE33016802121679FF49FE69FF
12C87901490269016004F01876014640
76FE126CA2F2FE33F265F12964146500
D4557415F229D45500EE808080808080
8000000000006B206C00A2EADBC17C01
3C2012FC6A0000EE0000000000000000
00000000000000000000000000000000
6A126B01611062006000A2B0D127F029
3000DAB571087A083130122461107208
6A127B08A300F01EF05570013010120A
6A126B016C0062FFC0067002225272FF
320012386E006E00F00A22527E017E01
124884A085B086C03002126445011264
75F876FC300812704519127075087604
3006127C4412127C74F876FF30041288
442A128874087601A300F61EF0658100
6000A300F61EF055A300FC1E8010F055
F129D455DAB58A408B508C6000EEEE5E
FEFEFEFEFEFEFEFE0000000000000000
00000000000000000000000000000000
12128D8D20A93139393020525454208E
8E0024B624DA600FE0A11224600EE0A1
1228121624DA122C00E0122CC11F7110
C20F7208C30385308610872088304800
7701480177FF48027601480376FFA54C
D121D67164F069F1A800F41E8030F055
7401A800F41E6001F05525226A007A00
F0073000129C3D0012946000F029DBC5
3F01128CDBC52522F015129CFE156D01
6E00129C80E0F029DBC525226003E0A1
63006006E0A163016007E0A163026008
E0A16303430072FF43017201430271FF
43037101A54CD1213F0113243D011388
603F8102601F820280B080173F011388
80B0700380153F01138880C080273F01
138880C0700480253F0113886004F018
CE077E028AE4A54CD1216000F029DBC5
80E0F029DBC56030F015F0073000131A
A54CD1219350133E7401A800F41E8030
F0557401A800F41E6000F0558530A800
F41EF0657001F0554A001358600C70FF
3000134E7AFF1270A54CD671480077FF
48017701480276FF48037601A800F91E
F06570FFF055300012707901A800F91E
F065880079011270600DF018600BE09E
138E6B016C006D007B013B0A13AA6B00
7C013C0A13AA6C007D01A54CD6714800
77FF48017701480276FF48037601A800
F91EF06570FFF05530001398994013DE
7901A800F91EF06588007901139800E0
66116709682F6917A552D67ED87E77FF
A54ED671D6917608D671D6917608D671
D6917608A550D671D691A59E66136711
249AA5AEF36593D01424803080D53F01
143A144492C01432802080C53F01143A
1444801080B53F001444A5AE83D082C0
81B0F355A5AEF365661377F98D308C20
8B10A5A4249AC13FC21F600D80153F00
147C603080173F00147C600380253F00
147C601880273F00147C1482C30FF329
D125600FE0A11490600EE0A114961456
00E024B6122C00E0122CD675A5AA7602
D674FD29760AD675FC297605D675FB29
7605D67500EEA54E61006200661FD121
D1617108314014BEA5526201653FD12F
D52F720FD12FD52F00EE610C6207A562
D12AA56C7106D12AA5767106D12AA56C
7106D12AA5807106D12AA56C7106D12A
610E6218A58AD123A58E710872FFD124
710972FEA592D12671067201A598D125
00EE6DC5CB3F8EB08ED44F0115247B01
6DE6CC1F8EC08ED44F0115327C016D00
CE3F7E40FE15CE3F7E4000EE8000FF00
FE008080808080808080808080808080
80801F1010101F010101011F11111111
1F04040404041F01020204040808101F
1F11101010131111111F050502007151
51750C121E141209143E15152A007744
24147700575272525700000100010000
00000000000000000000000000000000
00000000000000000000000000000000
123076FB602080654F006600138400FF
00000001000C0A001902040608020203
2C000F0002052E080000020500000000
6E006DA06A0869066804670266196410
630C62006106A212FA5523D46040F015
F0073000125023D4230A2362A212F565
22AE22C622EC3F0123143F0122EC3F01
22EC3F01227C4F0113661262A212F565
460035001288138CE7A16209E8A16204
E9A16206EAA16201420000EE22AE8120
239A23AC6C0162006F00A212F555A3FF
41016000410460134106600D41096006
F01ED34700EE6005E09E00EE450F00EE
650F76FFA212F55574037303239A239A
239AA223F555A419D34100EEA223F565
450000EEA419D341239A6C0223BE4BBB
130AD341A223F55500EE65006000A217
F0551304A21DF565350F1344A41AD345
32001332C103A219F11EF0658100C20F
7201239AA41A6C0372FF6F00D345A21D
F55500EEC407A41FF41EF0658300A427
F41EF0658400A41AD3456020F018650F
133E6500133E4C0112024C021382A223
F56545001202A419D3416F00D3413F01
12027E0A6040F01800E0124A00E023D4
6060F01813946E001384410174FF4104
73FF410673014109740100EE44007401
43007301433873FF441874FF00EE6B00
440013CE430013CE433F13CE441F6BBB
6F0000EE63086408A229FE33F26523EC
6328A229F633F26523F200EEF029D345
7306F129D3457306F229D34500EE0110
547C6C7C7C447C7C6C7C541000FC786E
78FC003F1E761E3F0080A870F870A80B
1B283830201000000000081B1B1B1804
00000000000000000000000000000000
124EEAACAAEACEAAAAAEE0A0A0E0C040
40E0E020C0E0E06020E0A0E020206040
2040E080E0E0E0202020E0E0A0E0E0E0
20E040A0E0A0E0C080E0E080C080A040
A0A0A202DAB400EEA202DAB413DC6801
69056A0A6B01652A662BA216D8B4A23E
D9B4A202362BA206DAB46B06A21AD8B4
A23ED9B4A206452AA202DAB46B0BA21E
D8B4A23ED9B4A2065560A202DAB46B10
A226D8B4A23ED9B4A20676FF462AA202
DAB46B15A22ED8B4A23ED9B4A2069560
A202DAB46B1AA232D8B4A23ED9B42242
6817691B6A206B01A20AD8B4A236D9B4
A202DAB46B06A22AD8B4A20AD9B4A206
8750472AA202DAB46B0BA22AD8B4A20E
D9B4A206672A87B1472BA202DAB46B10
A22AD8B4A212D9B4A2066678671F8762
4718A202DAB46B15A22AD8B4A216D9B4
A2066678671F87634767A202DAB46B1A
A22AD8B4A21AD9B4A206668C678C8764
4718A202DAB4682C69306A346B01A22A
D8B4A21ED9B4A206668C6778876547EC
A202DAB46B06A22AD8B4A222D9B4A206
66E0866E46C0A202DAB46B0BA22AD8B4
A236D9B4A206660F86664607A202DAB4
6B10A23AD8B4A21ED9B4A3E860006130
F155A3E9F065A2064030A202DAB46B15
A23AD8B4A216D9B4A3E86689F633F265
A2023001A2063103A2063207A206DAB4
6B1AA20ED8B4A23ED9B4124813DC0000
00000000000000000000000000000000
A2B423E622B67001D0113025120671FF
D011601AD01160253100120EC4704470
121CC303601E6103225CF515D0143F01
123CD01471FFD0142340121CE7A12272
E8A12284E9A12296E29E12506600F615
F6073600123CD0147101122AA2C4F41E
660043016604430266084303660CF61E
00EED01470FF23343F0100EED0147001
233400EED014700123343F0100EED014
70FF233400EED014730143046300225C
23343F0100EED01473FF43FF6303225C
233400EE8000670568066904611F6510
620700EE40E0000040C0400000E04000
406040004040600020E00000C0404000
00E080004040C00000E0200060404000
80E0000040C08000C060000040C08000
C060000080C040000060C00080C04000
0060C000C0C00000C0C00000C0C00000
C0C000004040404000F0000040404040
00F00000D014663576FF3600133800EE
A2B48C103C1E7C013C1E7C013C1E7C01
235E4B0A237291C000EE71011350601B
6B00D0113F007B01D011700130251362
00EE601BD0117001302513748E108DE0
7EFF601B6B00D0E13F001390D0E11394
D0D17B017001302513864B0013A67DFF
7EFF3D01138223C03F0123C07A0123C0
80A06D0780D2400475FE4502650400EE
A700F255A804FA33F265F0296D326E00
DDE57D05F129DDE57D05F229DDE5A700
F265A2B400EE6A00601900EE37230000
00000000000000000000000000000000
12185449435441432062792044617669
642057494E5445526B006C0080B081C0
A3E6F155A3C4FF65A3B4FF55A3E6F165
8B008C1000E06E0160136103A39AD011
7008302B123E601371083123123E6013
6103A39BD01F7008303312546013710F
D01A7008303312602366F00A8100A3B4
F01EF0654000128A227C126A6010F018
F015F0073000128200EE60028E0380E0
F055A3D4801070FF8004F01EF165A3AA
3E03A3AFD01522C83A00121CA3B46100
62006301F06530007101F31E72013210
12B43110126A121C6A00A3B46001F01E
F865690089042344891423448924234A
690089342344894423448954234A6900
89642344897423448984234A69008964
2344893423448904234A690089742344
894423448914234A6900898423448954
23448924234A69008984234489442344
8904234A690089642344894423448924
234A00EE890E890E00EE49151354493F
135A00EE23667B01135E23667C012366
6A01F00A00EE6305640AA3AFD3456302
7406A3E6FB3323886332640AA3AAD345
632F7406A3E6FC33F265F0292394F129
2394F229D345730500EE7F8080808080
808080808080808080801C2222221C22
14081422010000000000000000000101
01010101010000000000000000000101
0101010113051B052305130D1B0D230D
13151B15231500000000000000000000
00000000000000000000000000000000
A2CD69386A08D9A3A2D06B006C03DBC3
A2D6641D651FD4516700680F22A222AC
48001222641E651CA2D3D4536E006680
6D04EDA166FF6D05EDA166006D06EDA1
6601368022D8A2D0DBC3CD018BD4DBC3
3F001292A2CDD9A3CD013D006DFF79FE
D9A33F00128C4E00122EA2D3D4534500
128675FF8464D4533F0112466D088D52
4D08128C129222AC78FF121E22A27705
129622A2770F22A26D03FD18A2D3D453
1286A2F8F733630022B600EEA2F8F833
633222B600EE6D1BF265F029D3D57305
F129D3D57305F229D3D500EE017CFE7C
60F06040E0A0F8D46E016D10FD1800EE
00000000000000000000000000000000
00E023B66007E09E1204680067032346
224A22C02366238A23ACF00A225A225A
22D022883A00121C6C0123AC77FF23AC
6078F015F007300012343700121C23AC
6007E09E1242120A00FD69106002A254
D09500EE8080808080006001E0A11268
6004E0A1127200EE809070FF400000EE
127C80907001401B00EE127C6102A254
D195D105890000EE80A070FE300000EE
80B080954F0000EE8100620581253F00
00EEA2BAF01EF0658D004B016D014B1E
6DFF6C01600AF01800EEFFFF00010100
CB207B016A046C016D01A364DAB100EE
80A081B08AC48BD4A3644B016D014B1E
6DFF4A3E6CFF4A006C01D011DAB14F00
00EE80A0612180154F0000EE80A081B0
70DE71FF62FF63FF6403720180453F00
130A730181453F001312802081308024
80248134813470227101A386D0137EFF
60008C076002F018238A7801238A3E00
00EE236600EE00E060006100621FA364
D011D0217001303F1350D01171013120
135A00EE80006101630AA38660226207
D013700372FF32001370710373FF3300
136C6E4600EEE0A0E000A3A6F833F265
63036402F029D3457305F129D3457305
F229D34500EE00000000000060146102
F729D01500EE600A610C62096305A3CE
D015F31E700572FF320013C000EE9090
909060E090E090E0E090E09090202020
202090906090900000600000F090F080
80F080F010F0E090E090900000000000
00000000000000000000000000000000
121A4A4D4E203139393120534F465457
41524553208080FF00006300670000E0
A21760006100D01171FFD01171017008
304012267101A215D01270FFD0127001
7102311F12386008611062046437650F
6602D011D4516801E8A162026802E8A1
62046807E8A16201680AE8A16203680B
E8A16602680FE8A16604680CE8A16601
680DE8A16603420171FF420270FF4203
710142047001460175FF460274FF4603
750146047401D0113F0012B4D4513F00
12B81256770112BA7301680078013800
12BC00E060086104F329D0156034F729
D01568007801380012D4430812E44708
12E4121E12E400000000000000000000
00000000000000000000000000000000
A2CC6A0761006B086000D01170087BFF
3B00120A71047AFF3A00120666006710
A2CD6020611ED011631D623F820277FF
470012AAFF0AA2CBD23165FFC4013401
64FFA2CD6C006E04EEA16CFF6E06EEA1
6C01D01180C4D0114F01129842006401
423F64FF43006501431F12A4A2CBD231
82448354D2313F011242431E12986A02
FA187601467012AAD231C401340164FF
C501350165FF12426A03FA18A2CBD231
73FF1236A2CBD2311228A2CDD011A2F0
F633F2656318641BF029D3457305F129
D3457305F229D34512C8018044FF0000
00000000000000000000000000000000