IMD 1.16: 2/09/2008 12:44:19 84-93899-01 a000 f89901 2july82 nm4 okidata microline printer test program - source disk okidata.asm okidata.jcl    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF181111716544204811117165442 811117165442) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL NM4 OKIDATA MICROLINE PRINTER TEST PROGRAM 93899-10A0 TITL TITLE PAGE * * NM4 OKIDATA MICROLINE PRINTER * * * TEST PROGRAM * * * 84-93899-10-A0 * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL REVISION HISTORY ****************************** * * REVISION HISTORY * ****************************** * * REVISION ISSUE DATE COMMENTS * -------- ---------- -------- * * A0 7/82 ORIGINAL RELEASE *  BY ROBERT ROBINSON * REV: EQU 'A0' LATEST REVISION TITL HARDWARE REQUIREMENTS ****************************** * * HARDWARE REQUIREMENTS * ****************************** * * NAKED MINI 4 PROCESSOR WITH PROGRAMMER'S CONSOLE. * * MINIMUM OF 8K WORDS OF READ/WRITE MEMORY. * * DISTRIBUTED I/O BOARD (DIO). * * ASR-33 OR EQUIVALENT TTY OR CRT TERMINAL CONNECTED TO * CHANNEL 4 OF THE DIO. * * OKIDATA MICROLINE LINE PRINTER CONNECTED TO CHANNEL * 7 OF THE DIO. * TITL LINKER INFORMATION ****************************** * * LINKER INFORMATION * ****************************** * OBJNOTE 'OKIDATA.OBJ - REV. ',REV:%-8,REV:&:FF TITL TEST PROGRAM INFORMATION ****************************** * * TEST PROGRAM INFORMATION * ********** ******************** * * CONSISTS OF: * * FUNCTION TESTS * * TEST A - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A ROTATING ASCII PATTERN IN * THE 'NORMAL' CHARACTER MODE. * * TEST B - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' CHARACTER MODE. * *  TEST C - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'NORMAL' CHARACTER MODE. * * TEST D - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'EXPANDED' CHARACER MODE. * * TEST E - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * * TEST F - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A ROTATING GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * TITL * * TEST G - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' CHARACTER MODE. * * TEST H - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * * TEST I - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'EXPANDED' CHARACER MODE. * * TEST J - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * ****************************** TITL EQUATES (PROGRAM EQUATES) ****************************** * * PROGRAM EQUATES * ****************************** * * OKIDATA MICROLINE PRINTER CONTROL CHARACTERS * GS EQU :1D REDUCED CHARACTER CODE RS EQU :1E NORMAL CHARACTER CODE US EQU :1F ENLARGED CHARACTER CODE * LF EQU :0A LINE FEED PAGE EQU :0C CLEAR SCREEN (TOF) CR EQU :0D CARRIAGE RETURN ESCAPE EQU :1B ESCAPE KEY * * I/O DEVICE ADDRESSES * CONSL EQU :00 CONSOLE DEVICE ADDRESS DTTYDA EQU :7C CRT/TTY DEVICE ADD. (DIO) DLPDA EQU :7F LP DEVICE ADD. (DIO) * * CONSOLE FUNCTION CODES * SSW EQU :00 CONSOLE SENSE SWITCH (FUNCTION CODE) INT EQU :01 CONSOLE INT. LIGHT (FUNCTION CODE) CDR EQU :04 CONSOLE DATA REG. (FUNCTION CODE) TITL * * PSW BIT EQUATES * CY: EQU 0 CARRY BIT OV: EQU 1 OVERFLOW BIT BY: EQU 2 BYTE MODE BIT CI: EQU 4 CONSOLE INTERRUPT ENABLE BIT RC: EQU 5 REAL-TIME-CLOCK INT. ENABLE BIT XA: EQU 6 EXTENDED ADDRESSING BIT GI: EQU 8 GLOBAL INT. ENABLE BIT EI: EQU 12 EOBS INTS. BIT DI: EQU 13 DATA INTS. BIT TITL EQUATES (CDR DISPLAY) ****************************** * * CDR DISPLAY EQUATES * ****************************** * * END OF TESTING DISPLAY * FINI EQU 0 TESTING IS ALL DONE * * TRAP/EXCEPTION/CONSOLE INT. DISPLAYS * ER3000 EQU :3000 CONSOLE INTERRUPT ER3100 EQU :3100 UNIMPLEMENTED INSTRUCTION TRAP ER3200 EQU :3200 UNINSTALLED MEMORY TRAP ER3300 EQU :3300 POWER FAIL ER3400 EQU :3400 CHAR./NUMERIC EXCEPTION ER3500 EQU :3500 STACK OVERFLOW ER3600 EQU :3600 USER TRAP ER3700 EQU :3700 SYSTEM TRAP ER3800 EQU :3800 ARITHMETIC TRAP TITL MACROS (EJECTP) ****************************** * * EJECT P - EJECT PAGE * * THIS MACRO WILL GENERATE CODE FOR THE * BEGINNING OF EACH TEST. * * CALLING SEQUENCE: (ONE LINE) * CDR TEST NUMBER, * TEST TITLE ADDR. * ****************************** * EJECTP XMACRO COPY =#(1),A GET CDR MODULE NUMBER SELP A,CONSL;CDR SEND TO CDR JST MSGA OUTPUT TEST LETTER WORD #(2) TEST TITLE ADDR. COPY =RS,A GET CTRL CHAR. (RS) JSK OUTLP SEND TO OKIDATA PRINTER COPY =PAGE,A GET CTRL. CHAR. JSK OUTLP EJECT PAGE JST MSGALP SEND TITLE TO OKIDATA WORD #(2) TEST TITLE ADDR. COPY FORMTBL,X GET PARAMETER TABLE ADDR. ENDM TITL STANDARD TRAP ADDRESSES ****************************** * * STANDARD TRAPS/EXCEPTION ADDRESSES * ****************************** * ABS :80 POWER UP JST *$+1 JUMP TO POWER UP ROUTINE WORD POWERUP ADD. OF ROUTINE * ABS :84 TRAP ADD. :0084 RES 2,0 UNIMPLEMENTED INSTRUCTION TRAP  JST *$+1 JUMP TO SERVICE ROUTINE WORD UITRT ADD. OF ROUTINE * RES 2,0 UNINSTALLED MEMORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UMRT ADD. OF ROUTINE * RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PFRT ADD. OF ROUTINE * ABS :94 CONSOLE INT. JST *$+1 JUMP TO SERVICE ROUTINE WORD CINT ADD. OF ROUTINE * ABS :98 TRAP ADD. :0098 RES 2,0 CHAR./NUM. EXCEPTION JST *$+1 JUMP TO SERVICE ROUTINE WORD CNERT ADD. OF ROUTINE * RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD STOV ADD. OF ROUTINE * RES 2,0 USER TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UTRT ADD. OF ROUTINE * RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD STRT ADD. OF ROUTINE * RES 2,0 ARITHEMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD AERT ADD. OF ROUTINE TITL PROGRAM STARTUP ****************************** * * PROGRAM STARTUP * * :200 - DEFSTR (DEFAULT START) * * RESET STATUS REG. * RESET SENSE SWITCH * RESET CONSOLE INTERRUPT * SET STACK POINTERS * ENABLE CONSOLE INTERRUPT * PRINT TEST TITLE * ****************************** * ABS :200 PROGRAM START DEFSTR EQU $ COPY =0,A RESET A-REG. COPY A,S RESET STATUS REG. OUT A,CONSL;INT RESET CONSOLE INT. COPY =STACK,A SET A TO LOW STACK COPY A,L SET LOW STACK LIMIT ADD =128,A SET STACK SIZE COPY A,K SET STACK POINTER JST MSGA DISPLAY TITLE OF PROGRAM WORD TITLE MESS. ADD. SBIT CI:,S ENABLE CONSOLE INT. SBIT GI:,S ENABLE INTS. TITL QUERIES (TESTS) ****************************** * * TESTS * * QUERY: * * TESTS ([A,B,C,D,E,F,G,H,I,J])? * * DEFAULT IS A-J. * ****************************** * QERY10 EQU $ COPY =TESTS,X GET WORKING TABLE ADDR. COPY =TSTTBL,Y GET DEFAULT TABLE ADDR. COPY =-TSTSIZ,Q GET TABLE SIZE QERY11 COPY 0(Y),A GET TEST ADDR. COPY A,0(X) STORE IN WORKING TABLE ADD =1,X INC. WORKING TABLE ADDR. ADD =1,Y INC. DEFAULT TABLE ADDR. IJNE Q,QERY11 DO MORE COPY =-1,A SET TERMINATOR COPY A,0(X) STORE IN WORKINT TABLE COPY =-TSTSIZ-1,Q GET TABLE SIZE COPY =TESTS,Y GET WORKING TABLE ADDR. JST MSGA OUTPUT QUERY WORD QERM10 MESS. ADDR. QERY12 JSK CRTINP GET AN INPUT CLSN A,=',' ','? JMP QERY12 TRY AGAIN CLSN A,=CR CR? JMP QERY20 GO ON CSK A,='J' SEE IF INPUT IS CSK A,='A' BETWEEN A AND J INCLUSIVE JMP QERY10 NO, BAD NOP YES SUB ='A',A GENERATE OFFSET ADD =TSTTBL,A ADD IN TABLE ADD. COPY A,X PUT INTO X-REG. COPY 0(X), A GET TEST ADD. COPY A,0(Y) PUT INTO WORKING TEST TABLE COPY =-1,A SET TERMINATOR COPY A,1(Y) PUT INTO TABLE ADD =1,Y BUMP TABLE POINTER IJNE Q,QERY12 LOOP FOR MORE JMP QERY10 TOO MANY * LPOOL TITL QUERIES (PAPER SIZE) ****************************** * * PAPER SIZE * * QUERY: * * A - FORM 11 3/4" BY 8 1/2" * B - FORM 8 1/2" BY 11" * C - FORM 15" BY 11" * SELECT PAPER SIZE ([A], B OR C )- * * DEFAULT IS A. * ****************************** * QERY20 EQU $ COPY =FORM:A,A GET DEFAULT TABLE ADDR. COPY A,FORMTBL SET IT COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QERM20 MESS. ADDR. QERY21 JSK CRTINP GET RESPONSE CLSN A,='^' GO BACK? JEQ Q,QERY10 DO IT CLSN A,=CR CR? JMP QERY22 IS SO, EXIT JNE Q,QERY20 BEEN HERE BEFORE CLSN A,='A' FORM A? COPY =FORM:A,Q YES, GET TABLE ADDR. CLSN A,='B' FORM B? COPY =FORM:B,Q YES, GET TABLE ADDR. CLSN A,='C' FORM C? COPY =FORM:C,Q YES, GET TABLE ADDR. JNE Q,QERY21 GET TERMINATOR COPY =-1,Q SET ERROR FLAG JMP QERY21 GET TERMINATOR QERY22 JLT Q,QERY20 JUMP IF ERROR INPUT! JEQ Q,$+2 IF DEFAULT, JUMP COPY Q,FORMTBL STORE TABLE ADDR. JMP QERY30 GO ON * LPOOL TITL QUERIES (LINES PER INCH) ****************************** * * LINES PER INCH * * QUERY: * * A - 6 LPI * B - 8 LPI * LINES PER INCH ([A] OR B)- * * DEFAULT IS A. * ****************************** * QERY30 EQU $ COPY FORMTBL,X GET PARAMETER TABLE SHIFT X,LO,1 MAKE IT A BYTE ADDR. COPY ='6',A SET DEFAULT FOR 6 LPI SBIT BY:,S BYTE MODE COPYB A,7(X) STORE IN TABLE RBIT BY:,S WORD MODE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QERM30 MESS. ADDR. QERY31 JSK CRTINP GET RESPONSE CLSN A,='^' GO BACK? JEQ Q,QERY20 DO IT CLSN A,=CR CR? JMP QERY32 IF SO, EXIT JNE Q,QERY30 BEEN HERE BEFORE CLSN A,='A' 6 LPI? COPY ='6',Q IF SO, GET CODE CLSN A,='B' 8 LPI? COPY ='8',Q IF SO, GET CODE JNE Q,QERY31 GET TERMINATOR COPY =-1,Q SET ERROR FLAG JMP QERY31 GET TERMINATOR QERY32 JLT Q,QERY30 JUMP IF ERROR INPUT! JEQ Q,$+6 DEFAULT COPY FORMTBL,X GET PARAMETER TABLE SHIFT X,LO,1 MAKE IT A BYTE ADDR. SBIT BY:,S BYTE MODE COPYB Q,7(X) STORE IN TABLE RBIT BY:,S WORD MODE TITL TEST CONTROL (TEST EXECUTION) ****************************** * * TEST CONTROL - TEST EXECUTION AND CONTROL * * THIS SECTION WILL INITIALIZE THE OKIDATA PRINTER * TO THE SELECTED PARAMETERS AND EXECUTE THE * REQUESTED FUNCTION TEST(S). * ****************************** * TSTCRL10 EQU $ COPY =-8,Q SET FOR 8 CONTROL CHARS. TSTCRL11 EQU $ SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. RBIT BY:,S SET WORD MODE JSK OUTLP SEND TO OKIDATA ADD =1,X INC. TABLE ADDR. IJNE Q,TSTCRL11 DO MORE * COPY =LF,A DO LINE FEED TO CRT JSK OUTCRT DO IT COPY =TESTS,A GET TEST TABLE ADD. COPY A,TSTADD SET STARTING ADD. TSTCRL12 EQU $ COPY TSTADD,X GET TABLE ADD. COPY 0(X),X GET TEST ADDR. JLT X,TSTCRL13 IF MORE, JUMP JSK 0(X) DO TEST IMS TSTADD INC. TABLE ADD.  JMP TSTCRL12 LOOP FOR MORE TSTCRL13 EQU $ COPY =FINI,A GET CDR 'END OF TESTS' DISPLAY SELP A,CONSL;CDR DISPLAY IT JST MSGA OUTPUT MESS. WORD EOT 'END OF TESTS' JMP QERY10 ELSE EXIT * LPOOL TITL TESTS (TEST A) ******************************* * *  TEST A - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A ROTATING ASCII PATTERN IN * THE 'N ORMAL' CHARACTER MODE. * ******************************* * TESTA EQU $ TEST A EJECTP :01,TSTA:MSG COPY 5(X),Y GET 'LINES PER PAGE' NEG Y NEGATE IT COPY =:20,A GET FIRST CHAR. TSTA:01 COPY 4(X),Q GET 'CHARACTERS PER LINE' NEG Q NEGATE IT COPY A,CHARCNT SAVE STARTING CHAR. TSTA:02 JSK OUTLP PRINT CHAR. ADD =1,A NEW CHAR. CLSN A,=:5F START AGAIN? COPY =:20,A YES, GET FIRST CHAR. IJNE Q,TSTA:02 INC. CHAR. COUNT COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND TO LP COPY =LF,A LINE FEED JSK OUTLP SEND TO LP COPY CHARCNT,A RESTORE CHAR. ADD =1,A CLSN A,=:5F START AGAIN? COPY =:20,A YES, GET FIRST CHAR. IJNE Y,TSTA:01 DO MORE RSK EXIT TEST A TITL TESTS (TEST B) ****************************** * * TEST B - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' CHARACTER MODE. * ****************************** * TESTB EQU $ TEST B EJECTP :02,TSTB:MSG COPY =GS,A REDUCED MODE CTRL. CHAR. JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A SET A TO ZERO DIV =3,AQ FIND A THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ FIND NUM. + 2/3(NUM). JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST B * LPOOL TITL TESTS (TEST C) ****************************** * *  TEST C - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'NORMAL' CHARACTER MODE. * ****************************** * TESTC EQU $ TEST C EJECTP :03,TSTC:MSG COPY 4(X),Q GET JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST C TITL TESTS (TEST D) ****************************** * * TEST D - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'EXPANDED' CHARACER MODE. * ****************************** * TESTD EQU $ TEST D EJECTP :04,TSTD:MSG COPY =US,A GET EXPANDED MODE CTRL. CHAR. JSK OUTLP SEND TO LP COPY 4(X),Q GET CHARS. PER LINE SHIFT Q,RO,1 DIVIDE BY 2 JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST D TITL TESTS (TEST E) ****************************** * * TEST E - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * ****************************** * TESTE EQU $ TEST E EJECTP :05,TSTE:MSG COPY =GS,A FIRST REDUCED MODE JSK OUTLP SEND TO LP COPY =US,A THEN EXPANDED MODE JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A SET A TO ZERO DIV =3,AQ GET ONE THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ GENERATE NUM. + 2/3(NUM) SHIFT Q,RO,1 DIVIDE BY 2 - (NUM + 2/3(NUM))/2 JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST E * LPOOL TITL TESTS (TEST F) ****************************** * * TEST F - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A ROTATING GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * ****************************** * TESTF EQU $ TEST F EJECTP :06,TSTF:MSG COPY =:80,A GET FIRST CHAR. COPY 5(X),Y GET 'LINES PER PAGE' NEG Y NEGATE IT TSTF:01 COPY 4(X),Q GET 'CHARACTERS PER LINE' NEG Q NEGATE IT COPY A,CHARCNT SAVE STARTING CHAR. TSTF:02 JSK OUTLP PRINT CHAR. ADD =1,A NEW CHAR. CLSN A,=:C0 START AGAIN? COPY =:80,A YES, GET FIRST CHAR. IJNE Q,TSTF:02 INC. CHAR. COUNT CO PY =CR,A CARRIAGE RETURN JSK OUTLP SEND TO LP COPY =LF,A LINE FEED JSK OUTLP COPY CHARCNT,A RESTORE CHAR. ADD =1,A CLSN A,=:C0 START AGAIN? COPY =:80,A YES, GET FIRST CHAR. IJNE Y,TSTF:01 DO MORE RSK EXIT TEST F TITL TESTS (TEST G) ****************************** * * TEST G - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' CHARACTER MODE. * ****************************** * TESTG EQU $ EJECTP :07,TSTG:MSG COPY =GS,A REDUCED MODE CTRL. CHAR. JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A RESET A REG. DIV =3,AQ FIND ONE THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ GENERATE NUM. + 2/3(NUM) JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST G TITL TESTS (TEST H) ****************************** * * TEST H - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * ****************************** * TESTH EQU $ TEST H EJECTP :08,TSTH:MSG COPY 4(X),Q GET CHARS. PER LINE JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST H * LPOOL TITL TESTS (TEST I) ****************************** * * TEST I - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'EXPANDED' CHARACER MODE. * ****************************** * TESTI EQU $ TEST I EJECTP :09,TSTI:MSG COPY =US,A EXPANDED MODE CTRL. CHAR. JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE SHIFT Q,RO,1 DIVIDE BY 2 JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST I TITL TESTS (TEST J) ****************************** * * TEST J - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * ****************************** * TESTJ EQU $ TEST J EJECTP :0A,TSTJ:MSG COPY =GS,A FIRST REDUCED MODE JSK OUTLP SEND TO OKIDATA COPY =US,A THEN EXPANDED MODE JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A RESET A REG. DIV =3,AQ FIND ONE THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ GENERATE NUM. + 2/3(NUM) SHIFT Q,RO,1 DIVIDE BY 2 - (NUM + 2/3(NUM))/2 JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST J * LPOOL TITL TEST UTILITIES (PRINTASC) ******************************* * * PRINTASC - PRINT STRAIGHT ASCII PATTERN (FULL CHAR. LINE) * * THIS SUBROUTINE WILL PRINT ONE PAGE * OF A STRAIGHT ASCII PATTERN. * * CALLING SEQUENCE: * COPY =CHARS. PER LINE,Q * JSK PRINTASC * ******************************* * PRINTASC EQU $ CSK Q,=132 DO RANGE CHECK JMP $+2 ITS OK COPY =132,Q TOO MANY, LIMIT = 132 NEG Q NEGATE IT COPY Q,CHARCNT STORE IT COPY 5(X),Y GET 'LINES PER PAGE' SUB =2,Y LESS TWO FOR TITLE NEG Y NEGATE IT PRINT:00 COPY CHARCNT,Q GET 'CHARACTERS PER LINE' COPY =:20,A FIRST CHARACTER PRINT:01 JSK OUTLP PRINT CHAR. ADD =1,A NEW CHAR. CLSN A,=:5F START AGAIN? COPY =:20,A YES, GET FIRST CHAR. IJNE Q,PRINT:01 INC. CHAR. COUNT COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND TO LP COPY =LF,A LINE FEED JSK OUTLP SEND TO LP IJNE Y,PRINT:00 DO MORE RSK EXIT * CHARCNT WORD 0 CHARACTERS PER LINE TITL TEST UTILITIES (PRINTGRA) ***************************** ** * * PRINTGRA - PRINT STRAIGHT GRAPHIC PATTERN (FULL CHAR. LINE) * * THIS SUBROUTINE WILL PRINT ONE PAGE *  OF A STRAIGHT GRAPHIC PATTERN. * * CALLING SEQUENCE: * COPY =CHARS. PER LINE,Q * JSK PRINTGRA * ******************************* * PRINTGRA EQU $ CSK Q,=132 DO RANGE CHECK JMP $+2 ITS OK COPY =132,Q TOO MANY, LIMIT = 132 SUB =25,Q SUBTRACT BARS & SPACES SHIFT Q,RO,2 DIVIDE NUMBER BY 4 NEG Q NEGATE IT COPY Q,CHARCNT STORE IT COPY 5(X),Y GET 'LINES PER PAGE' SUB =2,Y LESS TWO FOR TITLE SHIFT Y,RO,1 DIVIDE BY 2 NEG Y NEGATE IT COPY =:80,A GET STARTING CHAR. PRINT:02 JSK BARS DISPLAY BAR COPY =-4,Q GET SECOND COUNT COPY Q,CHARCNT2 STORE IT PRINT:03 COPY CHARCNT,Q GET 'CHARACTERS PER LINE/4' PRINT:04 JSK OUTLP PRINT CHAR. IJNE Q,PRINT:04 INC. FIRST CHAR. COUNT JSK BARS ADD =1,A NEW CHAR. CLSN A,=:C0 START AGAIN? COPY =:80,A YES, GET FIRST CHAR. IMS CHARCNT2 INC. SECOND CHAR. COUNT JMP PRINT:03 DO SOME MORE COPY A,Q SAVE CHAR. COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND IT COPY =LF,A CARRIAGE RETURN JSK OUTLP SEND IT JSK BARS DISPLAY BAR COPY =-4,A SET OUTTER COUNT COPY A,CHARCNT2 STORE IT PRINT5 COPY CHARCNT,X GET COUNT COPY =:80,A SET FOR BLANK CHAR. PRINT6 JSK OUTLP SEND TO LP IJNE X,PRINT6 JSK BARS DISPLAY BAR IMS CHARCNT2 INC. OUTTER LOOP JMP PRINT5 LOOP BACK COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND IT COPY =LF,A LINE FEED JSK OUTLP SEND IT COPY Q,A RESTORE CHAR. IJNE Y,PRINT:02 DO SOME MORE LINES RSK EXIT * CHARCNT2 WORD 0 SECOND CHAR. COUNT TITL TEST UTILITIES (BARS) ****************************** * * BARS - DISLAY A BAR IN GRAPHIC MODE * * THIS SUBROUTINE WILL DISPLAY A * GRAPHIC "BAR". * * CALLING SEQUENCE: * JSK BARS * ******************************* * BARS EQU $ PUSH :110 SAVE ALL REGS. COPY =' ',A DISPLAY A SPACE JSK OUTLP DO IT JSK OUTLP DO IT COPY =:BF,A HERE IS A 'BAR' JSK OUTLP DO IT COPY =' ',A DISPLAY A SPACE AGAIN JSK OUTLP DO IT JSK OUTLP DO IT POP RESTORE ALL RSK EXIT * LPOOL TITL PROGRAM UTILITIES (CRTINP) ****************************** * * CRTINP - THIS SUBROUTINE WILL INPUT, INTO * THE LEAST SIGNIFICANT BYTE OF THE * A-REG., AN ASCII CHAR. FROM THE * CRT KEYBOARD/TTY. * * CALLING SEQUENCE: * JSK CRTINP * ****************************** * CRTINP EQU $ KEYBOARD INPUT RBIT GI:,S NO INTERRUPTS COPY =:100,A GET RESET CODE OUT A,DTTYDA%1;1 SEND TO PICO COPY =:8618,A GET CRT/TTY INPUT STARTUP COM. OUT A,DTTYDA%1;1 SEND TO CRT/TTY IN DTTYDA%1;1,A GET STATUS FROM CRT/TTY SHIFT A,RO,4 SHIFT 'DATA READY' BIT (3) INTO OV JF OV,$-2 IF 'DATA READY' IS RESET, LOOP BACK IN DTTYDA%1,A INPUT ASCII CHAR. FROM CRT/TTY AND =:7F,A MASK OFF POSSIBLE PARITY BIT COPY A,IKBTMP SAVE CHAR. COPY =:100,A GET CRT/TTY RESET COM. CODE OUT A,DTTYDA%1;1 SEND TO CRT/TTY COPY IKBTMP,A RESTORE CHAR. TO A SBIT GI:,S ENABLE INTS. RSK EXIT INPU * IKBTMP RES 1,0 SAVED INPUT CHAR. TITL PROGRAM UTILITIES (OUTCRT) ****************************** * * OUTCRT - THIS SUBROUTINE WILL OUTPUT * THE LEASE SIGNIFICANT BYTE OF THE * A-REG. TO THE CRT/TTY. * *  CALLING SEQUENCE: * COPY =CHAR.,A * JSK OUTCRT * ****************************** * OUTCRT EQU $ OUTPUT TO CR T/TTY PUSH :10 SAVE ALL RBIT GI:,S DISABLE INTS. COPY =:100,X GET CRT RESET CODE OUT X,DTTYDA%1;1 RESET CRT/TTY PICO COPY =:8612,X CRT/TTY STARTUP COM. OUT X,DTTYDA%1;1 SEND COM. TO CRT/TTY OUT A,DTTYDA%1 SEND CHAR. TO CRT/TTY IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JT OV,$-2 IF TRUE -TX EMPTY- LOOP BACK IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JF OV,$-2 IF FALSE -TX FULL- LOOP BACK COPY =:100,X GET CRT/TTY RESET COM. CODE OUT X,DTTYDA%1;1 SEND TO CRT/TTY POP RESTORE ALL SBIT GI:,S ENABLE INTS. RSK EXIT TITL PROGRAM UTILITIES (OUTLP) ****************************** * * OUTLP - THIS SUBROUTINE WILL OUTPUT THE * LEAST SIGNIFICANT BYTE OF THE * A-REG. TO THE OKIDATA PRINTER. * * CALLING SEQUENCE: * COPY =CHAR.,A * JSK OUTLP * ****************************** * OUTLP EQU $ OUTPUT TO PRINTER PUSH :10 SAVE ALL RBIT GI:,S NO INTS. COPY =:100,Q GET RESET CODE OUT Q,DLPDA%1;1 SEND TO PICO COPY =-8,Q 8 SECOND DELAY COPY Q,CNT2 STORE COUNT COPY =0,Q INNER LOOP COUNT COPY Q,CNT1 STORE COUNT OUT A,DLPDA%1 SEND CHAR. COPY =:8610,Q LP START UP COMMAND OUT Q,DLPDA%1;1 START IT OUT Q,DLPDA%1;1 DITTO OUTLP1 IN DLPDA%1;1,Q INPUT STATUS SHIFT Q,RO,1 SHIFT 'BUSY BIT' TO OV JF OV,OUTLP2 IF NOT BUSY, EXIT JST TIME DO DELAY JMP OUTLP1 LOOP BACK IF NOT DONE PUSH :10 SAVE ALL AGAIN JST MSGA OUTPUT ERROR MESSAGE WORD LPTIOT 'LINE PRINTER TIMED OUT' JSK CRTINP GET RESPONSE POP RESTORE ALL JMP OUTLP+2 TRY AGAIN OUTLP2 COPY =:100,Q GET LP RESET COMMAND OUT Q,DLPDA%1;1 RESET LP SHIFT Q,RO,1 WASTE SOME TIME JNE Q,$-1 DITTO POP RESTORE ALL SBIT GI:,S ENABLE INTS. RSK EXIT TITL PROGRAM UTILITIES (MSGA) ****************************** * * MSGA - THIS SUBROUTINE WILL PRINT AN ASCII * MESSAGE, THE LAST CHAR. OF WHICH * MUST BE 0, TO THE CRT. * * CALLING SEQUENCE: * JST MSGA * WORD (MESSAGE ADDR.) * ****************************** * MSGA ENT PRINT MESSAGE COPY X,MSTMP SAVE THE X-REG. COPY *MSGA,X GET MESSAGE ADDR. IMS MSGA INC. RETURN ADDR. SHIFT X,LO,1 CONVERT WORD ADDR. TO A BYTE ADDR. MSGA1 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. FROM MESSAGE RBIT BY:,S SET WORD MODE JEQ A,MSGA2 IF END OF MESSAGE, EXIT LOOP JSK OUTCRT DISPLAY CHAR. ADD =1,X INC. MESSAGE ADDR. JMP MSGA1 LOOP BACK FOR MORE MSGA2 COPY MSTMP,X RESTORE THE X-REG. JMP *MSGA EXIT * MSTMP WORD 0 SAVED X-REG. TITL PROGRAM UTILITIES (MSGALP) ****************************** * * MSGALP - THIS SUBROUTINE WILL PRINT AN ASCII * MESSAGE, THE LAST CHAR. OF WHICH * MUST BE 0, TO THE LP. * * CALLING SEQUENCE: * JST MSGALP * WORD (MESSAGE ADDR.) * ****************************** * MSGALP ENT PRINT MESSAGE COPY *MSGALP,X GET MESSAGE ADDR. IMS MSGALP INC. RETURN ADDR. SHIFT X,LO,1 CONVERT WORD ADDR. TO A BYTE ADDR. MSGALP1 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. FROM MESSAGE RBIT BY:,S SET WORD MODE CLSN A,=0 END OF MESSAGE? JMP *MSGALP YES, EXIT JSK OUTLP DISPLAY CHAR. ADD =1,X INC. MESSAGE ADDR. JMP MSGALP1 LOOP BACK FOR MORE TITL PROGRAM UTILITIES (TIME) ****************************** * * TIME - THIS SUBROUTINE WILL INC. THE * TIME PARAMET ERS AND MAKE THE * APPROPRIATE RETURN IF THE TIME * HAS OR HAS NOT EXPIRED. * * CALLING SEQUENCE: * JST TIME * JMP ? TIME NOT EXPIRED * JMP ? TIME EXPIRED * ****************************** * TIME ENT IMS CNT1 INC. INNER LOOP COUNT JMP *TIME COUNT NOT EXPIRED IMS CNT2 INC. OUTTER LOOP COUNT JMP *TIME COUNT NOT EXPIRED IMS TIME TIME EXPIRED JMP *TIME MAKE APPROPRIATE RETURN * CNT1 WORD 0 INNER LOOP COUNT CNT2 WORD 0 OUTTER LOOP COUNT TITL PROGRAM UTILITIES (RESETCRT) ****************************** * * RESETCRT - THIS SUBROUTINE WILL RESET THE * CRT TO 'NORMAL' MODE WITH TAG * BITS RESET AND A SCREEN ERASE. * * CALLING SEQUENCE: * COPY =CDR ERROR DISPLAY,A * JSK RESETCRT * ****************************** * RESETCRT EQU $ IN CONSL;CDR,Q GET CDR DISPLAY AND =:FF,Q MASK FOR TESTS ONLY OR A,Q 'OR' IN CDR ERROR DISPLAY SELP Q,CONSL;CDR COPY =:100,A GET RESET COMMAND OUT A,DLPDA%1;1 RESET LP OUT A,DTTYDA%1;1 RESET CRT/TTY COPY =CR,A DO A JSK OUTLP CR TO THE PRINTER COPY =LF,A THEN DO A JSK OUTLP LINE FEED RSK EXIT * LPOOL TITL TRAP'S AND CONSOLE INT. SERVICE ROUTINES ****************************** * * TRAP SERVICE ROUTINES * ****************************** * * UNIMPLEMENTED INSTRUCTION TRAP * UITRT ENT UNI. INSTR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INSMSG,X GET TRAP MESSAGE ADDR. COPY =ER3100,A GET TRAP CDR DISPLAY SRT2 COPY =0,Q SET Q-REG. TO ZERO COPY Q,S SET PSW TO ZERO COPY X,SR:MSG SAVE MESSAGE ADDR. JSK RESETCRT SET CRT FOR NORMAL MODE JST MSGA OUTPUT ERROR MESSAGE SR:MSG WORD 0 MESSAGE ADDR. HLT WAIT HERE JMP DEFSTR GO TO QUERIES * * UNINSTALLED MEMORY TRAP * UMRT ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =MEMMSG,X GET TRAP MESSAGE ADDR. COPY =ER3200,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER UP * POWERUP ENT PWR. UP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =POWMSG,X GET TRAP MESSAGE ADDR. COPY =ER3300,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER FAIL * PFRT ENT PWR. FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTION * CNERT ENT CHAR./NUM. EXCEP. SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =CHAMSG,X GET TRAP MESSAGE ADD. COPY =ER3400,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * STACK OVERFLOW * STOV ENT STK. OVR. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =STKMSG,X GET TRAP MESSAGE ADDR. COPY =ER3400,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * USER TRAP * UTRT ENT USER TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =USEMSG,X GET TRAP MESSAGE ADDR. COPY =ER3500,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * SYSTEM TRAP * STRT ENT SYSTEM TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =SYSMSG,X GET TRAP MESSAGE ADDR. COPY =ER3600,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * ARITHMETIC TRAP * AERT ENT ARIT. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =ARIMSG,X GET TRAP MESSAGE ADDR.  COPY =ER3700,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * ****************************** * * CONSOLE INT. SERVICE ROUTINE * ****************************** * CINT ENT CONSOLE INT. SERVICE ROUTINE SIN 2 STATUS INHIBIT COPY =0,A RESET A  -REG. COPY A,S RESET STATUS REG. COPY =ER3000,A GET CDR DISPLAY JSK RESETCRT SET NORMAL CRT JMP DEFSTR GO TO QUERIES * LPOOL TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * ****************************** * OPTIONS +:20 * TESTS RES 12,-1 WORKING TEST TABLE * TSTADD WORD TESTS TEST TABLE ADDR. * FORMTBL WORD FORM:A LINE PRINTER FORM TABLE ADDR. * TITL TABLES (TEST ADDRESSES) ****************************** * * TSTTBL - DEFAULT TEST ADDRESSES * ****************************** * TSTTBL EQU $ DEFAULT TEST ADDR. TABLE * WORD TESTA TEST A * WORD TESTB TEST B * WORD TESTC TEST C * WORD TESTD TEST D * WORD TESTE TEST E * WORD TESTF TEST F * WORD TESTG TEST G * WORD TESTH TEST H * WORD TESTI TEST I * WORD TESTJ TEST J * TSTSIZ EQU $-TSTTBL TABLE ADDR. SIZE TITL TABLES (PRINTER TEST - FORM:A) ****************************** * * FORM:A - PARAMETER TABLE FOR 11 3/4" BY 8 1/2" PAPER * * TABLE FORMAT: * FORM LENGTH CODE - "ESC","F" *  PAPER SIZE CODE - "50" * LONG LINE CODE - "ESC","A" * LINES PER INCH CODE - "ESC","6" OR "8" * PROGRAM CHARACTERS * PER LINE - 100 * PROGRAM LINES PER *  PAGE - 44 * ****************************** * FORM:A EQU $ * BYTE ESCAPE,'F50' * BYTE ESCAPE,'A' * BYTE ESCAPE,'6' * WORD 100 * WORD 44 TITL TABLES (PRINTER TEST - FORM:B) ****************************** * * FORM:B - PARAMETER TABLE FOR 8 1/2" BY 11" PAPER * * TABLE FORMAT: * FORM LENGTH CODE - "ESC","F" * PAPER SIZE CODE - "66" * SHORT LINE CODE - "ESC","B" * LINES PER INCH CODE - "ESC","6" OR "8" *  PROGRAM CHARACTERS * PER LINE - 80 * PROGRAM LINES PER * PAGE  - 59 * ****************************** * FORM:B EQU $ * BYTE ESCAPE,'F66' * BYTE ESCAPE,'B' * BYTE ESCAPE,'6' * WORD 80 * WORD 59 TITL TABLES (PRINTER TEST - FORM:C) ****************************** * * FORM:C - PARAMETER TABLE FOR 15" BY 11" PAPER * * TABLE FORMAT: * FORM LENGTH CODE - "ESC","F" * PAPER SIZE CODE - "66" *  LONG LINE CODE - "ESC","A" * LINES PER INCH CODE - "ESC","6" OR "8" * PROGRAM CHARACTERS * PER LINE - 128 * PROGRAM LINES PER * PAGE - 59 * ****************************** * FORM:C EQU $ * BYTE ESCAPE,'F66' * BYTE ESCAPE,'A' * BYTE ESCAPE,'6' * WORD 128 * WORD 59 TITL CRT MESSAGES (QUERY MESSAGES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE WORD :0C20 BYTE 'NM4 OKIDATA MICROLINE PRINTER TEST PROGRAM' BYTE CR,LF,'93899-' WORD REV:,CR%8;LF,0 * QERM10 BYTE CR,LF,'TESTS ([A,B,C,D,E,F,G,H,I,J])?',0 * QERM20 BYTE CR,LF,'A - FORM 11 3/4" BY 8 1/2"' BYTE CR,LF,'B - FORM 8 1/2" BY 11"' BYTE CR,LF,'C - FORM 15" BY 11"' BYTE CR,LF,'SELECT PAPER SIZE ([A], B OR C)-',0 * QERM30 BYTE CR,LF,'A - 6 LPI' BYTE CR,LF,'B - 8 LPI' BYTE CR,LF,'LINES PER INCH ([A] OR B)-',0 TITL CRT MESSAGES (TEST TITLES) ****************************** * * TEST TITLES * ***************  *************** * TSTA:MSG BYTE 'TEST A - ROTATING ASCII IN NORMAL MODE',CR,LF,LF,0 * TSTB:MSG BYTE 'TEST B - STRAIGHT ASCII IN REDUCED MODE',CR,LF,LF,0 * TSTC:MSG BYTE 'TEST C - STRAIGHT ASCII IN NORMAL MODE',CR,LF,LF,0 * TSTD:MSG BYTE 'TEST D - STRAIGHT ASCII IN EXPANDED MODE',CR,LF,LF,0 * TSTE:MSG BYTE 'TEST E - STRAIGHT ASCII IN REDUCED & EXPANDED MODE',CR,LF,LF,0 * TSTF:MSG BYTE 'TEST F - ROTATING GRAPHIC IN NORMAL MODE',CR,LF,LF,0 * TSTG:MSG BYTE 'TEST G - STRAIGHT GRAPHIC IN REDUCED MODE',CR,LF,LF,0 * TSTH:MSG BYTE 'TEST H - STRAIGHT GRAPHIC IN NORMAL MODE',CR,LF,LF,0 * TSTI:MSG BYTE 'TEST I - STRAIGHT GRAPHIC IN EXPANDED MODE',CR,LF,LF,0 * TSTJ:MSG BYTE 'TEST J - STRAIGHT GRAPHIC IN REDUCED & EXPANDED MODE',CR,LF,LF,0 TITL CRT MESSAGES (TRAP/EXCEPTION MESSAGES) ***************************** * * TRAP/EXCEPTION MESSAGES * ***************************** * INSMSG BYTE CR,LF,'UNIMPLEMENTED INSTRUCTION TRAP',CR,LF,0 * MEMMSG BYTE CR,LF,'UNINSTALLED MEMORY TRAP',CR,LF,0 * POWMSG BYTE CR,LF,'POWER FAIL',CR,LF,0 * CHAMSG BYTE CR,LF,'CHAR./NUM. EXCEPTION',CR,LF,0 * STKMSG BYTE CR,LF,'STACK OVERFLOW',CR,LF,0 * USEMSG BYTE CR,LF,'USER TRAP',CR,LF,0 * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT MESSAGES (MISCELLANEOUS MESSAGES) ***************************** * * MISCELLANEOUS MESSAGES * ***************************** * EOT BYTE CR,LF,'END OF TESTS',CR,LF,0 * LPTIOT BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 TITL STACK ****************************** * * STACK SPACE * ****************************** * STACK EQU $ RES 128,0 STACK SPACE * ENDPROG EQU $ END OF PROGRAM END DEFSTR THAT'S ALL FOLKES!!! * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT MESSAGES (MISCELLANEOUS MESSAGES) ***************************** * * MISCELLANEOUS MESSAGES * ***************************** * EOT BYTE CR,LF,'END OF TESTS',CR,LF,0 * LPTIOT BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 TITL STACK ****************************** * * STACK S/AS LO=TV MACRO OKIDATA(ERR) LINK OKIDATA 811117165442811117165442811117165442 BY ROBERT ROBINSON * REV: EQU 'A0' LATEST REVISION TITL HARDWARE REQUIREMENTS ****************************** * * HARDWARE REQUIREMENTS * ****************************** * * NAKED MINI 4 PROCESSOR WITH PROGRAMMER'S CONSOLE. * * MINIMUM OF 8K WORDS OF READ/WRITE MEMORY. * * DISTRIBUTED I/O BOARD (DIO). * * ASR-33 OR EQUIVALENT TTY OR CRT TERMINAL CONNECTED TO * CHANNEL 4 OF THE DIO. * * OKIDATA MICROLINE LINE PRINTER CONNECTED TO CHANNEL * 7 OF THE DIO. * TITL LINKER INFORMATION ****************************** * * LINKER INFORMATION * ****************************** * OBJNOTE 'OKIDATA.OBJ - REV. ',REV:%-8,REV:&:FF TITL TEST PROGRAM INFORMATION ****************************** * * TEST PROGRAM INFORMATION * **********  ******************** * * CONSISTS OF: * * FUNCTION TESTS * * TEST A - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A ROTATING ASCII PATTERN IN * THE 'NORMAL' CHARACTER MODE. * * TEST B - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' CHARACTER MODE. * *  TEST C - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'NORMAL' CHARACTER MODE. * * TEST D - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'EXPANDED' CHARACER MODE. * * TEST E - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * * TEST F - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A ROTATING GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * TITL * * TEST G - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' CHARACTER MODE. * * TEST H - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * * TEST I - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'EXPANDED' CHARACER MODE. * * TEST J - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * ****************************** TITL EQUATES (PROGRAM EQUATES) ****************************** * * PROGRAM EQUATES * ****************************** * * OKIDATA MICROLINE PRINTER CONTROL CHARACTERS * GS EQU :1D REDUCED CHARACTER CODE RS EQU :1E NORMAL CHARACTER CODE US EQU :1F ENLARGED CHARACTER CODE * LF EQU :0A LINE FEED PAGE EQU :0C CLEAR SCREEN (TOF) CR EQU :0D CARRIAGE RETURN ESCAPE EQU :1B ESCAPE KEY * * I/O DEVICE ADDRESSES * CONSL EQU :00 CONSOLE DEVICE ADDRESS DTTYDA EQU :7C CRT/TTY DEVICE ADD. (DIO) DLPDA EQU :7F LP DEVICE ADD. (DIO) * * CONSOLE FUNCTION CODES * SSW EQU :00 CONSOLE SENSE SWITCH (FUNCTION CODE) INT EQU :01 CONSOLE INT. LIGHT (FUNCTION CODE) CDR EQU :04 CONSOLE DATA REG. (FUNCTION CODE) TITL * * PSW BIT EQUATES * CY: EQU 0 CARRY BIT OV: EQU 1 OVERFLOW BIT BY: EQU 2 BYTE MODE BIT CI: EQU 4 CONSOLE INTERRUPT ENABLE BIT RC: EQU 5 REAL-TIME-CLOCK INT. ENABLE BIT XA: EQU 6 EXTENDED ADDRESSING BIT GI: EQU 8 GLOBAL INT. ENABLE BIT EI: EQU 12 EOBS INTS. BIT DI: EQU 13 DATA INTS. BIT TITL EQUATES (CDR DISPLAY) ****************************** * * CDR DISPLAY EQUATES * ****************************** * * END OF TESTING DISPLAY * FINI EQU 0 TESTING IS ALL DONE * * TRAP/EXCEPTION/CONSOLE INT. DISPLAYS * ER3000 EQU :3000 CONSOLE INTERRUPT ER3100 EQU :3100 UNIMPLEMENTED INSTRUCTION TRAP ER3200 EQU :3200 UNINSTALLED MEMORY TRAP ER3300 EQU :3300 POWER FAIL ER3400 EQU :3400 CHAR./NUMERIC EXCEPTION ER3500 EQU :3500 STACK OVERFLOW ER3600 EQU :3600 USER TRAP ER3700 EQU :3700 SYSTEM TRAP ER3800 EQU :3800 ARITHMETIC TRAP TITL MACROS (EJECTP) ****************************** * * EJECT  P - EJECT PAGE * * THIS MACRO WILL GENERATE CODE FOR THE * BEGINNING OF EACH TEST. * * CALLING SEQUENCE: (ONE LINE) * CDR TEST NUMBER, * TEST TITLE ADDR. * ****************************** * EJECTP XMACRO COPY =#(1),A GET CDR MODULE NUMBER SELP A,CONSL;CDR SEND TO CDR JST MSGA OUTPUT TEST LETTER WORD #(2) TEST TITLE ADDR. COPY =RS,A GET CTRL CHAR. (RS) JSK OUTLP SEND TO OKIDATA PRINTER COPY =PAGE,A GET CTRL. CHAR. JSK OUTLP EJECT PAGE JST MSGALP SEND TITLE TO OKIDATA WORD #(2) TEST TITLE ADDR. COPY FORMTBL,X GET PARAMETER TABLE ADDR. ENDM TITL STANDARD TRAP ADDRESSES ****************************** * * STANDARD TRAPS/EXCEPTION ADDRESSES * ****************************** * ABS :80 POWER UP JST *$+1 JUMP TO POWER UP ROUTINE WORD POWERUP ADD. OF ROUTINE * ABS :84 TRAP ADD. :0084 RES 2,0 UNIMPLEMENTED INSTRUCTION TRAP  JST *$+1 JUMP TO SERVICE ROUTINE WORD UITRT ADD. OF ROUTINE * RES 2,0 UNINSTALLED MEMORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UMRT ADD. OF ROUTINE * RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PFRT ADD. OF ROUTINE * ABS :94 CONSOLE INT. JST *$+1 JUMP TO SERVICE ROUTINE WORD CINT ADD. OF ROUTINE * ABS :98 TRAP ADD. :0098 RES 2,0 CHAR./NUM. EXCEPTION JST *$+1 JUMP TO SERVICE ROUTINE WORD CNERT ADD. OF ROUTINE * RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD STOV ADD. OF ROUTINE * RES 2,0 USER TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UTRT ADD. OF ROUTINE * RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD STRT ADD. OF ROUTINE * RES 2,0 ARITHEMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD AERT ADD. OF ROUTINE TITL PROGRAM STARTUP ****************************** * * PROGRAM STARTUP * * :200 - DEFSTR (DEFAULT START) * * RESET STATUS REG. * RESET SENSE SWITCH * RESET CONSOLE INTERRUPT * SET STACK POINTERS * ENABLE CONSOLE INTERRUPT * PRINT TEST TITLE * ****************************** * ABS :200 PROGRAM START DEFSTR EQU $ COPY =0,A RESET A-REG. COPY A,S RESET STATUS REG. OUT A,CONSL;INT RESET CONSOLE INT. COPY =STACK,A SET A TO LOW STACK COPY A,L SET LOW STACK LIMIT ADD =128,A SET STACK SIZE COPY A,K SET STACK POINTER JST MSGA DISPLAY TITLE OF PROGRAM WORD TITLE MESS. ADD. SBIT CI:,S ENABLE CONSOLE INT. SBIT GI:,S ENABLE INTS. TITL QUERIES (TESTS) ****************************** * * TESTS * * QUERY: * * TESTS ([A,B,C,D,E,F,G,H,I,J])? * * DEFAULT IS A-J. * ****************************** * QERY10 EQU $ COPY =TESTS,X GET WORKING TABLE ADDR. COPY =TSTTBL,Y GET DEFAULT TABLE ADDR. COPY =-TSTSIZ,Q GET TABLE SIZE QERY11 COPY 0(Y),A GET TEST ADDR. COPY A,0(X) STORE IN WORKING TABLE ADD =1,X INC. WORKING TABLE ADDR. ADD =1,Y INC. DEFAULT TABLE ADDR. IJNE Q,QERY11 DO MORE COPY =-1,A SET TERMINATOR COPY A,0(X) STORE IN WORKINT TABLE COPY =-TSTSIZ-1,Q GET TABLE SIZE COPY =TESTS,Y GET WORKING TABLE ADDR. JST MSGA OUTPUT QUERY WORD QERM10 MESS. ADDR. QERY12 JSK CRTINP GET AN INPUT CLSN A,=',' ','? JMP QERY12 TRY AGAIN CLSN A,=CR CR? JMP QERY20 GO ON CSK A,='J' SEE IF INPUT IS CSK A,='A' BETWEEN A AND J INCLUSIVE JMP QERY10 NO, BAD NOP YES SUB ='A',A GENERATE OFFSET ADD =TSTTBL,A ADD IN TABLE ADD. COPY A,X PUT INTO X-REG. COPY 0(X),  A GET TEST ADD. COPY A,0(Y) PUT INTO WORKING TEST TABLE COPY =-1,A SET TERMINATOR COPY A,1(Y) PUT INTO TABLE ADD =1,Y BUMP TABLE POINTER IJNE Q,QERY12 LOOP FOR MORE JMP QERY10 TOO MANY * LPOOL TITL QUERIES (PAPER SIZE) ****************************** * * PAPER SIZE * * QUERY: * * A - FORM 11 3/4" BY 8 1/2" * B - FORM 8 1/2" BY 11" * C - FORM 15" BY 11" * SELECT PAPER SIZE ([A], B OR C )- * * DEFAULT IS A. * ****************************** * QERY20 EQU $ COPY =FORM:A,A GET DEFAULT TABLE ADDR. COPY A,FORMTBL SET IT COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QERM20 MESS. ADDR. QERY21 JSK CRTINP GET RESPONSE CLSN A,='^' GO BACK? JEQ Q,QERY10 DO IT CLSN A,=CR CR? JMP QERY22 IS SO, EXIT JNE Q,QERY20 BEEN HERE BEFORE CLSN A,='A' FORM A? COPY =FORM:A,Q YES, GET TABLE ADDR. CLSN A,='B' FORM B? COPY =FORM:B,Q YES, GET TABLE ADDR. CLSN A,='C' FORM C? COPY =FORM:C,Q YES, GET TABLE ADDR. JNE Q,QERY21 GET TERMINATOR COPY =-1,Q SET ERROR FLAG JMP QERY21 GET TERMINATOR QERY22 JLT Q,QERY20 JUMP IF ERROR INPUT! JEQ Q,$+2 IF DEFAULT, JUMP COPY Q,FORMTBL STORE TABLE ADDR. JMP QERY30 GO ON * LPOOL TITL QUERIES (LINES PER INCH) ****************************** * * LINES PER INCH * * QUERY: * * A - 6 LPI * B - 8 LPI * LINES PER INCH ([A] OR B)- * * DEFAULT IS A. * ****************************** * QERY30 EQU $ COPY FORMTBL,X GET PARAMETER TABLE SHIFT X,LO,1 MAKE IT A BYTE ADDR. COPY ='6',A SET DEFAULT FOR 6 LPI SBIT BY:,S BYTE MODE COPYB A,7(X) STORE IN TABLE RBIT BY:,S WORD MODE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QERM30 MESS. ADDR. QERY31 JSK CRTINP GET RESPONSE CLSN A,='^' GO BACK? JEQ Q,QERY20 DO IT CLSN A,=CR CR? JMP QERY32 IF SO, EXIT JNE Q,QERY30 BEEN HERE BEFORE CLSN A,='A' 6 LPI? COPY ='6',Q IF SO, GET CODE CLSN A,='B' 8 LPI? COPY ='8',Q IF SO, GET CODE JNE Q,QERY31 GET TERMINATOR COPY =-1,Q SET ERROR FLAG JMP QERY31 GET TERMINATOR QERY32 JLT Q,QERY30 JUMP IF ERROR INPUT! JEQ Q,$+6 DEFAULT COPY FORMTBL,X GET PARAMETER TABLE SHIFT X,LO,1 MAKE IT A BYTE ADDR. SBIT BY:,S BYTE MODE COPYB Q,7(X) STORE IN TABLE RBIT BY:,S WORD MODE TITL TEST CONTROL (TEST EXECUTION) ****************************** * * TEST CONTROL - TEST EXECUTION AND CONTROL * * THIS SECTION WILL INITIALIZE THE OKIDATA PRINTER * TO THE SELECTED PARAMETERS AND EXECUTE THE * REQUESTED FUNCTION TEST(S). * ****************************** * TSTCRL10 EQU $ COPY =-8,Q SET FOR 8 CONTROL CHARS. TSTCRL11 EQU $ SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. RBIT BY:,S SET WORD MODE JSK OUTLP SEND TO OKIDATA ADD =1,X INC. TABLE ADDR. IJNE Q,TSTCRL11 DO MORE * COPY =LF,A DO LINE FEED TO CRT JSK OUTCRT DO IT COPY =TESTS,A GET TEST TABLE ADD. COPY A,TSTADD SET STARTING ADD. TSTCRL12 EQU $ COPY TSTADD,X GET TABLE ADD. COPY 0(X),X GET TEST ADDR. JLT X,TSTCRL13 IF MORE, JUMP JSK 0(X) DO TEST IMS TSTADD INC. TABLE ADD.  JMP TSTCRL12 LOOP FOR MORE TSTCRL13 EQU $ COPY =FINI,A GET CDR 'END OF TESTS' DISPLAY SELP A,CONSL;CDR DISPLAY IT JST MSGA OUTPUT MESS. WORD EOT 'END OF TESTS' JMP QERY10 ELSE EXIT * LPOOL TITL TESTS (TEST A) ******************************* * *  TEST A - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A ROTATING ASCII PATTERN IN * THE 'N ORMAL' CHARACTER MODE. * ******************************* * TESTA EQU $ TEST A EJECTP :01,TSTA:MSG COPY 5(X),Y GET 'LINES PER PAGE' NEG Y NEGATE IT COPY =:20,A GET FIRST CHAR. TSTA:01 COPY 4(X),Q GET 'CHARACTERS PER LINE' NEG Q NEGATE IT COPY A,CHARCNT SAVE STARTING CHAR. TSTA:02 JSK OUTLP PRINT CHAR. ADD =1,A NEW CHAR. CLSN A,=:5F START AGAIN? COPY =:20,A YES, GET FIRST CHAR. IJNE Q,TSTA:02 INC. CHAR. COUNT COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND TO LP COPY =LF,A LINE FEED JSK OUTLP SEND TO LP COPY CHARCNT,A RESTORE CHAR. ADD =1,A CLSN A,=:5F START AGAIN? COPY =:20,A YES, GET FIRST CHAR. IJNE Y,TSTA:01 DO MORE RSK EXIT TEST A TITL TESTS (TEST B) ****************************** * * TEST B - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' CHARACTER MODE. * ****************************** * TESTB EQU $ TEST B EJECTP :02,TSTB:MSG COPY =GS,A REDUCED MODE CTRL. CHAR. JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A SET A TO ZERO DIV =3,AQ FIND A THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ FIND NUM. + 2/3(NUM). JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST B * LPOOL TITL TESTS (TEST C) ****************************** * *  TEST C - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'NORMAL' CHARACTER MODE. * ****************************** * TESTC EQU $ TEST C EJECTP :03,TSTC:MSG COPY 4(X),Q GET JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST C TITL TESTS (TEST D) ****************************** * * TEST D - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'EXPANDED' CHARACER MODE. * ****************************** * TESTD EQU $ TEST D EJECTP :04,TSTD:MSG COPY =US,A GET EXPANDED MODE CTRL. CHAR. JSK OUTLP SEND TO LP COPY 4(X),Q GET CHARS. PER LINE SHIFT Q,RO,1 DIVIDE BY 2 JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST D TITL TESTS (TEST E) ****************************** * * TEST E - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT ASCII PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * ****************************** * TESTE EQU $ TEST E EJECTP :05,TSTE:MSG COPY =GS,A FIRST REDUCED MODE JSK OUTLP SEND TO LP COPY =US,A THEN EXPANDED MODE JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A SET A TO ZERO DIV =3,AQ GET ONE THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ GENERATE NUM. + 2/3(NUM) SHIFT Q,RO,1 DIVIDE BY 2 - (NUM + 2/3(NUM))/2 JSK PRINTASC PRINT STRAIGHT ASCII RSK EXIT TEST E * LPOOL TITL TESTS (TEST F) ****************************** * * TEST F - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A ROTATING GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * ****************************** * TESTF EQU $ TEST F EJECTP :06,TSTF:MSG COPY =:80,A GET FIRST CHAR. COPY 5(X),Y GET 'LINES PER PAGE' NEG Y NEGATE IT TSTF:01 COPY 4(X),Q GET 'CHARACTERS PER LINE' NEG Q NEGATE IT COPY A,CHARCNT SAVE STARTING CHAR. TSTF:02 JSK OUTLP PRINT CHAR. ADD =1,A NEW CHAR. CLSN A,=:C0 START AGAIN? COPY =:80,A YES, GET FIRST CHAR. IJNE Q,TSTF:02 INC. CHAR. COUNT CO PY =CR,A CARRIAGE RETURN JSK OUTLP SEND TO LP COPY =LF,A LINE FEED JSK OUTLP COPY CHARCNT,A RESTORE CHAR. ADD =1,A CLSN A,=:C0 START AGAIN? COPY =:80,A YES, GET FIRST CHAR. IJNE Y,TSTF:01 DO MORE RSK EXIT TEST F TITL TESTS (TEST G) ****************************** * * TEST G - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' CHARACTER MODE. * ****************************** * TESTG EQU $ EJECTP :07,TSTG:MSG COPY =GS,A REDUCED MODE CTRL. CHAR. JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A RESET A REG. DIV =3,AQ FIND ONE THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ GENERATE NUM. + 2/3(NUM) JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST G TITL TESTS (TEST H) ****************************** * * TEST H - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'NORMAL' CHARACTER MODE. * ****************************** * TESTH EQU $ TEST H EJECTP :08,TSTH:MSG COPY 4(X),Q GET CHARS. PER LINE JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST H * LPOOL TITL TESTS (TEST I) ****************************** * * TEST I - THIS TEST WILL EJECT A PAGE, AND PRINT *  ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'EXPANDED' CHARACER MODE. * ****************************** * TESTI EQU $ TEST I EJECTP :09,TSTI:MSG COPY =US,A EXPANDED MODE CTRL. CHAR. JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE SHIFT Q,RO,1 DIVIDE BY 2 JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST I TITL TESTS (TEST J) ****************************** * * TEST J - THIS TEST WILL EJECT A PAGE, AND PRINT * ONE PAGE OF A STRAIGHT GRAPHIC PATTERN IN * THE 'REDUCED' AND 'EXPANDED' CHARACTER MODE. * ****************************** * TESTJ EQU $ TEST J EJECTP :0A,TSTJ:MSG COPY =GS,A FIRST REDUCED MODE JSK OUTLP SEND TO OKIDATA COPY =US,A THEN EXPANDED MODE JSK OUTLP SEND TO OKIDATA COPY 4(X),Q GET CHARS. PER LINE COPY =0,A RESET A REG. DIV =3,AQ FIND ONE THIRD COPY 4(X),A GET CHARS. PER LINE INTO A MUL =2,AQ GENERATE NUM. + 2/3(NUM) SHIFT Q,RO,1 DIVIDE BY 2 - (NUM + 2/3(NUM))/2 JSK PRINTGRA PRINT STRAIGHT GRAPHIC RSK EXIT TEST J * LPOOL TITL TEST UTILITIES (PRINTASC) ******************************* * * PRINTASC - PRINT STRAIGHT ASCII PATTERN (FULL CHAR. LINE) * * THIS SUBROUTINE WILL PRINT ONE PAGE * OF A STRAIGHT ASCII PATTERN. * * CALLING SEQUENCE: * COPY =CHARS. PER LINE,Q * JSK PRINTASC * ******************************* * PRINTASC EQU $ CSK Q,=132 DO RANGE CHECK JMP $+2 ITS OK COPY =132,Q TOO MANY, LIMIT = 132 NEG Q NEGATE IT COPY Q,CHARCNT STORE IT COPY 5(X),Y GET 'LINES PER PAGE' SUB =2,Y LESS TWO FOR TITLE NEG Y NEGATE IT PRINT:00 COPY CHARCNT,Q GET 'CHARACTERS PER LINE' COPY =:20,A FIRST CHARACTER PRINT:01 JSK OUTLP PRINT CHAR. ADD =1,A NEW CHAR. CLSN A,=:5F START AGAIN? COPY =:20,A YES, GET FIRST CHAR. IJNE Q,PRINT:01 INC. CHAR. COUNT COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND TO LP COPY =LF,A LINE FEED JSK OUTLP SEND TO LP IJNE Y,PRINT:00 DO MORE RSK EXIT * CHARCNT WORD 0 CHARACTERS PER LINE TITL TEST UTILITIES (PRINTGRA) ***************************** ** * * PRINTGRA - PRINT STRAIGHT GRAPHIC PATTERN (FULL CHAR. LINE) * * THIS SUBROUTINE WILL PRINT ONE PAGE *  OF A STRAIGHT GRAPHIC PATTERN. * * CALLING SEQUENCE: * COPY =CHARS. PER LINE,Q * JSK PRINTGRA * ******************************* * PRINTGRA EQU $ CSK Q,=132 DO RANGE CHECK JMP $+2 ITS OK COPY =132,Q TOO MANY, LIMIT = 132 SUB =25,Q SUBTRACT BARS & SPACES SHIFT Q,RO,2 DIVIDE NUMBER BY 4 NEG Q NEGATE IT COPY Q,CHARCNT STORE IT COPY 5(X),Y GET 'LINES PER PAGE' SUB =2,Y LESS TWO FOR TITLE SHIFT Y,RO,1 DIVIDE BY 2 NEG Y NEGATE IT COPY =:80,A GET STARTING CHAR. PRINT:02 JSK BARS DISPLAY BAR COPY =-4,Q GET SECOND COUNT COPY Q,CHARCNT2 STORE IT PRINT:03 COPY CHARCNT,Q GET 'CHARACTERS PER LINE/4' PRINT:04 JSK OUTLP PRINT CHAR. IJNE Q,PRINT:04 INC. FIRST CHAR. COUNT JSK BARS ADD =1,A NEW CHAR. CLSN A,=:C0 START AGAIN? COPY =:80,A YES, GET FIRST CHAR. IMS CHARCNT2 INC. SECOND CHAR. COUNT JMP PRINT:03 DO SOME MORE COPY A,Q SAVE CHAR. COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND IT COPY =LF,A CARRIAGE RETURN JSK OUTLP SEND IT JSK BARS DISPLAY BAR COPY =-4,A SET OUTTER COUNT COPY A,CHARCNT2 STORE IT PRINT5 COPY CHARCNT,X GET COUNT COPY =:80,A SET FOR BLANK CHAR. PRINT6 JSK OUTLP SEND TO LP IJNE X,PRINT6 JSK BARS DISPLAY BAR IMS CHARCNT2 INC. OUTTER LOOP JMP PRINT5 LOOP BACK COPY =CR,A CARRIAGE RETURN JSK OUTLP SEND IT COPY =LF,A LINE FEED JSK OUTLP SEND IT COPY Q,A RESTORE CHAR. IJNE Y,PRINT:02 DO SOME MORE LINES RSK EXIT * CHARCNT2 WORD 0 SECOND CHAR. COUNT TITL TEST UTILITIES (BARS) ****************************** * * BARS - DISLAY A BAR IN GRAPHIC MODE * * THIS SUBROUTINE WILL DISPLAY A * GRAPHIC "BAR". * * CALLING SEQUENCE: * JSK BARS * ******************************* * BARS EQU $ PUSH :110 SAVE ALL REGS. COPY =' ',A DISPLAY A SPACE JSK OUTLP DO IT JSK OUTLP DO IT COPY =:BF,A HERE IS A 'BAR' JSK OUTLP DO IT COPY =' ',A DISPLAY A SPACE AGAIN JSK OUTLP DO IT JSK OUTLP DO IT POP RESTORE ALL RSK EXIT * LPOOL TITL PROGRAM UTILITIES (CRTINP) ****************************** * * CRTINP - THIS SUBROUTINE WILL INPUT, INTO * THE LEAST SIGNIFICANT BYTE OF THE * A-REG., AN ASCII CHAR. FROM THE * CRT KEYBOARD/TTY. * * CALLING SEQUENCE: * JSK CRTINP * ****************************** * CRTINP EQU $ KEYBOARD INPUT RBIT GI:,S NO INTERRUPTS COPY =:100,A GET RESET CODE OUT A,DTTYDA%1;1 SEND TO PICO COPY =:8618,A GET CRT/TTY INPUT STARTUP COM. OUT A,DTTYDA%1;1 SEND TO CRT/TTY IN DTTYDA%1;1,A GET STATUS FROM CRT/TTY SHIFT A,RO,4 SHIFT 'DATA READY' BIT (3) INTO OV JF OV,$-2 IF 'DATA READY' IS RESET, LOOP BACK IN DTTYDA%1,A INPUT ASCII CHAR. FROM CRT/TTY AND =:7F,A MASK OFF POSSIBLE PARITY BIT COPY A,IKBTMP SAVE CHAR. COPY =:100,A GET CRT/TTY RESET COM. CODE OUT A,DTTYDA%1;1 SEND TO CRT/TTY COPY IKBTMP,A RESTORE CHAR. TO A SBIT GI:,S ENABLE INTS. RSK EXIT INPU * IKBTMP RES 1,0 SAVED INPUT CHAR. TITL PROGRAM UTILITIES (OUTCRT) ****************************** * * OUTCRT - THIS SUBROUTINE WILL OUTPUT * THE LEASE SIGNIFICANT BYTE OF THE * A-REG. TO THE CRT/TTY. * *  CALLING SEQUENCE: * COPY =CHAR.,A * JSK OUTCRT * ****************************** * OUTCRT EQU $ OUTPUT TO CR T/TTY PUSH :10 SAVE ALL RBIT GI:,S DISABLE INTS. COPY =:100,X GET CRT RESET CODE OUT X,DTTYDA%1;1 RESET CRT/TTY PICO COPY =:8612,X CRT/TTY STARTUP COM. OUT X,DTTYDA%1;1 SEND COM. TO CRT/TTY OUT A,DTTYDA%1 SEND CHAR. TO CRT/TTY IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JT OV,$-2 IF TRUE -TX EMPTY- LOOP BACK IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JF OV,$-2 IF FALSE -TX FULL- LOOP BACK COPY =:100,X GET CRT/TTY RESET COM. CODE OUT X,DTTYDA%1;1 SEND TO CRT/TTY POP RESTORE ALL SBIT GI:,S ENABLE INTS. RSK EXIT TITL PROGRAM UTILITIES (OUTLP) ****************************** * * OUTLP - THIS SUBROUTINE WILL OUTPUT THE * LEAST SIGNIFICANT BYTE OF THE * A-REG. TO THE OKIDATA PRINTER. * * CALLING SEQUENCE: * COPY =CHAR.,A * JSK OUTLP * ****************************** * OUTLP EQU $ OUTPUT TO PRINTER PUSH :10 SAVE ALL RBIT GI:,S NO INTS. COPY =:100,Q GET RESET CODE OUT Q,DLPDA%1;1 SEND TO PICO COPY =-8,Q 8 SECOND DELAY COPY Q,CNT2 STORE COUNT COPY =0,Q INNER LOOP COUNT COPY Q,CNT1 STORE COUNT OUT A,DLPDA%1 SEND CHAR. COPY =:8610,Q LP START UP COMMAND OUT Q,DLPDA%1;1 START IT OUT Q,DLPDA%1;1 DITTO OUTLP1 IN DLPDA%1;1,Q INPUT STATUS SHIFT Q,RO,1 SHIFT 'BUSY BIT' TO OV JF OV,OUTLP2 IF NOT BUSY, EXIT JST TIME DO DELAY JMP OUTLP1 LOOP BACK IF NOT DONE PUSH :10 SAVE ALL AGAIN JST MSGA OUTPUT ERROR MESSAGE WORD LPTIOT 'LINE PRINTER TIMED OUT' JSK CRTINP GET RESPONSE POP RESTORE ALL JMP OUTLP+2 TRY AGAIN OUTLP2 COPY =:100,Q GET LP RESET COMMAND OUT Q,DLPDA%1;1 RESET LP SHIFT Q,RO,1 WASTE SOME TIME JNE Q,$-1 DITTO POP RESTORE ALL SBIT GI:,S ENABLE INTS. RSK EXIT TITL PROGRAM UTILITIES (MSGA) ****************************** * * MSGA - THIS SUBROUTINE WILL PRINT AN ASCII * MESSAGE, THE LAST CHAR. OF WHICH * MUST BE 0, TO THE CRT. * * CALLING SEQUENCE: * JST MSGA * WORD (MESSAGE ADDR.) * ****************************** * MSGA ENT PRINT MESSAGE COPY X,MSTMP SAVE THE X-REG. COPY *MSGA,X GET MESSAGE ADDR. IMS MSGA INC. RETURN ADDR. SHIFT X,LO,1 CONVERT WORD ADDR. TO A BYTE ADDR. MSGA1 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. FROM MESSAGE RBIT BY:,S SET WORD MODE JEQ A,MSGA2 IF END OF MESSAGE, EXIT LOOP JSK OUTCRT DISPLAY CHAR. ADD =1,X INC. MESSAGE ADDR. JMP MSGA1 LOOP BACK FOR MORE MSGA2 COPY MSTMP,X RESTORE THE X-REG. JMP *MSGA EXIT * MSTMP WORD 0 SAVED X-REG. TITL PROGRAM UTILITIES (MSGALP) ****************************** * * MSGALP - THIS SUBROUTINE WILL PRINT AN ASCII * MESSAGE, THE LAST CHAR. OF WHICH * MUST BE 0, TO THE LP. * * CALLING SEQUENCE: * JST MSGALP * WORD (MESSAGE ADDR.) * ****************************** * MSGALP ENT PRINT MESSAGE COPY *MSGALP,X GET MESSAGE ADDR. IMS MSGALP INC. RETURN ADDR. SHIFT X,LO,1 CONVERT WORD ADDR. TO A BYTE ADDR. MSGALP1 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. FROM MESSAGE RBIT BY:,S SET WORD MODE CLSN A,=0 END OF MESSAGE? JMP *MSGALP YES, EXIT JSK OUTLP DISPLAY CHAR. ADD =1,X INC. MESSAGE ADDR. JMP MSGALP1 LOOP BACK FOR MORE TITL PROGRAM UTILITIES (TIME) ****************************** * * TIME - THIS SUBROUTINE WILL INC. THE * TIME PARAMET ERS AND MAKE THE * APPROPRIATE RETURN IF THE TIME * HAS OR HAS NOT EXPIRED. * * CALLING SEQUENCE: * JST TIME * JMP ? TIME NOT EXPIRED * JMP ? TIME EXPIRED * ****************************** * TIME ENT IMS CNT1 INC. INNER LOOP COUNT JMP *TIME COUNT NOT EXPIRED IMS CNT2 INC. OUTTER LOOP COUNT JMP *TIME COUNT NOT EXPIRED IMS TIME TIME EXPIRED JMP *TIME MAKE APPROPRIATE RETURN * CNT1 WORD 0 INNER LOOP COUNT CNT2 WORD 0 OUTTER LOOP COUNT TITL PROGRAM UTILITIES (RESETCRT) ****************************** * * RESETCRT - THIS SUBROUTINE WILL RESET THE * CRT TO 'NORMAL' MODE WITH TAG * BITS RESET AND A SCREEN ERASE. * * CALLING SEQUENCE: * COPY =CDR ERROR DISPLAY,A * JSK RESETCRT * ****************************** * RESETCRT EQU $ IN CONSL;CDR,Q GET CDR DISPLAY AND =:FF,Q MASK FOR TESTS ONLY OR A,Q 'OR' IN CDR ERROR DISPLAY SELP Q,CONSL;CDR COPY =:100,A GET RESET COMMAND OUT A,DLPDA%1;1 RESET LP OUT A,DTTYDA%1;1 RESET CRT/TTY COPY =CR,A DO A JSK OUTLP CR TO THE PRINTER COPY =LF,A THEN DO A JSK OUTLP LINE FEED RSK EXIT * LPOOL TITL TRAP'S AND CONSOLE INT. SERVICE ROUTINES ****************************** * * TRAP SERVICE ROUTINES * ****************************** * * UNIMPLEMENTED INSTRUCTION TRAP * UITRT ENT UNI. INSTR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INSMSG,X GET TRAP MESSAGE ADDR. COPY =ER3100,A GET TRAP CDR DISPLAY SRT2 COPY =0,Q SET Q-REG. TO ZERO COPY Q,S SET PSW TO ZERO COPY X,SR:MSG SAVE MESSAGE ADDR. JSK RESETCRT SET CRT FOR NORMAL MODE JST MSGA OUTPUT ERROR MESSAGE SR:MSG WORD 0 MESSAGE ADDR. HLT WAIT HERE JMP DEFSTR GO TO QUERIES * * UNINSTALLED MEMORY TRAP * UMRT ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =MEMMSG,X GET TRAP MESSAGE ADDR. COPY =ER3200,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER UP * POWERUP ENT PWR. UP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =POWMSG,X GET TRAP MESSAGE ADDR. COPY =ER3300,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER FAIL * PFRT ENT PWR. FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTION * CNERT ENT CHAR./NUM. EXCEP. SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =CHAMSG,X GET TRAP MESSAGE ADD. COPY =ER3400,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * STACK OVERFLOW * STOV ENT STK. OVR. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =STKMSG,X GET TRAP MESSAGE ADDR. COPY =ER3400,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * USER TRAP * UTRT ENT USER TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =USEMSG,X GET TRAP MESSAGE ADDR. COPY =ER3500,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * SYSTEM TRAP * STRT ENT SYSTEM TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =SYSMSG,X GET TRAP MESSAGE ADDR. COPY =ER3600,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * ARITHMETIC TRAP * AERT ENT ARIT. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =ARIMSG,X GET TRAP MESSAGE ADDR.  COPY =ER3700,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * ****************************** * * CONSOLE INT. SERVICE ROUTINE * ****************************** * CINT ENT CONSOLE INT. SERVICE ROUTINE SIN 2 STATUS INHIBIT COPY =0,A RESET A -REG. COPY A,S RESET STATUS REG. COPY =ER3000,A GET CDR DISPLAY JSK RESETCRT SET NORMAL CRT JMP DEFSTR GO TO QUERIES * LPOOL TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * ****************************** * OPTIONS +:20 * TESTS RES 12,-1 WORKING TEST TABLE * TSTADD WORD TESTS TEST TABLE ADDR. * FORMTBL WORD FORM:A LINE PRINTER FORM TABLE ADDR. * TITL TABLES (TEST ADDRESSES) ****************************** * * TSTTBL - DEFAULT TEST ADDRESSES * ****************************** * TSTTBL EQU $ DEFAULT TEST ADDR. TABLE * WORD TESTA TEST A * WORD TESTB TEST B * WORD TESTC TEST C * WORD TESTD TEST D * WORD TESTE TEST E * WORD TESTF TEST F * WORD TESTG TEST G * WORD TESTH TEST H * WORD TESTI TEST I * WORD TESTJ TEST J * TSTSIZ EQU $-TSTTBL TABLE ADDR. SIZE TITL TABLES (PRINTER TEST - FORM:A) ****************************** * * FORM:A - PARAMETER TABLE FOR 11 3/4" BY 8 1/2" PAPER * * TABLE FORMAT: * FORM LENGTH CODE - "ESC","F" *  PAPER SIZE CODE - "50" * LONG LINE CODE - "ESC","A" * LINES PER INCH CODE - "ESC","6" OR "8" * PROGRAM CHARACTERS * PER LINE - 100 * PROGRAM LINES PER *  PAGE - 44 * ****************************** * FORM:A EQU $ * BYTE ESCAPE,'F50' * BYTE ESCAPE,'A' * BYTE ESCAPE,'6' * WORD 100 * WORD 44 TITL TABLES (PRINTER TEST - FORM:B) ****************************** * * FORM:B - PARAMETER TABLE FOR 8 1/2" BY 11" PAPER * * TABLE FORMAT: * FORM LENGTH CODE - "ESC","F" * PAPER SIZE CODE - "66" * SHORT LINE CODE - "ESC","B" * LINES PER INCH CODE - "ESC","6" OR "8" *  PROGRAM CHARACTERS * PER LINE - 80 * PROGRAM LINES PER * PAGE  - 59 * ****************************** * FORM:B EQU $ * BYTE ESCAPE,'F66' * BYTE ESCAPE,'B' * BYTE ESCAPE,'6' * WORD 80 * WORD 59 TITL TABLES (PRINTER TEST - FORM:C) ****************************** * * FORM:C - PARAMETER TABLE FOR 15" BY 11" PAPER * * TABLE FORMAT: * FORM LENGTH CODE - "ESC","F" * PAPER SIZE CODE - "66" *  LONG LINE CODE - "ESC","A" * LINES PER INCH CODE - "ESC","6" OR "8" * PROGRAM CHARACTERS * PER LINE - 128 * PROGRAM LINES PER * PAGE - 59 * ****************************** * FORM:C EQU $ * BYTE ESCAPE,'F66' * BYTE ESCAPE,'A' * BYTE ESCAPE,'6' * WORD 128 * WORD 59 TITL CRT MESSAGES (QUERY MESSAGES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE WORD :0C20 BYTE 'NM4 OKIDATA MICROLINE PRINTER TEST PROGRAM' BYTE CR,LF,'93899-' WORD REV:,CR%8;LF,0 * QERM10 BYTE CR,LF,'TESTS ([A,B,C,D,E,F,G,H,I,J])?',0 * QERM20 BYTE CR,LF,'A - FORM 11 3/4" BY 8 1/2"' BYTE CR,LF,'B - FORM 8 1/2" BY 11"' BYTE CR,LF,'C - FORM 15" BY 11"' BYTE CR,LF,'SELECT PAPER SIZE ([A], B OR C)-',0 * QERM30 BYTE CR,LF,'A - 6 LPI' BYTE CR,LF,'B - 8 LPI' BYTE CR,LF,'LINES PER INCH ([A] OR B)-',0 TITL CRT MESSAGES (TEST TITLES) ****************************** * * TEST TITLES * *************** *************** * TSTA:MSG BYTE 'TEST A - ROTATING ASCII IN NORMAL MODE',CR,LF,LF,0 * TSTB:MSG BYTE 'TEST B - STRAIGHT ASCII IN REDUCED MODE',CR,LF,LF,0 * TSTC:MSG BYTE 'TEST C - STRAIGHT ASCII IN NORMAL MODE',CR,LF,LF,0 * TSTD:MSG BYTE 'TEST D - STRAIGHT ASCII IN EXPANDED MODE',CR,LF,LF,0 * TSTE:MSG BYTE 'TEST E - STRAIGHT ASCII IN REDUCED & EXPANDED MODE',CR,LF,LF,0 * TSTF:MSG BYTE 'TEST F - ROTATING GRAPHIC IN NORMAL MODE',CR,LF,LF,0 * TSTG:MSG BYTE 'TEST G - STRAIGHT GRAPHIC IN REDUCED MODE',CR,LF,LF,0 * TSTH:MSG BYTE 'TEST H - STRAIGHT GRAPHIC IN NORMAL MODE',CR,LF,LF,0 * TSTI:MSG BYTE 'TEST I - STRAIGHT GRAPHIC IN EXPANDED MODE',CR,LF,LF,0 * TSTJ:MSG BYTE 'TEST J - STRAIGHT GRAPHIC IN REDUCED & EXPANDED MODE',CR,LF,LF,0 TITL CRT MESSAGES (TRAP/EXCEPTION MESSAGES) ***************************** * * TRAP/EXCEPTION MESSAGES * ***************************** * INSMSG BYTE CR,LF,'UNIMPLEMENTED INSTRUCTION TRAP',CR,LF,0 * MEMMSG BYTE CR,LF,'UNINSTALLED MEMORY TRAP',CR,LF,0 * POWMSG BYTE CR,LF,'POWER FAIL',CR,LF,0 * CHAMSG BYTE CR,LF,'CHAR./NUM. EXCEPTION',CR,LF,0 * STKMSG BYTE CR,LF,'STACK OVERFLOW',CR,LF,0 * USEMSG BYTE CR,LF,'USER TRAP',CR,LF,0 * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT MESSAGES (MISCELLANEOUS MESSAGES) ***************************** * * MISCELLANEOUS MESSAGES * ***************************** * EOT BYTE CR,LF,'END OF TESTS',CR,LF,0 * LPTIOT BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 TITL STACK ****************************** * * STACK SPACE * ****************************** * STACK EQU $ RES 128,0 STACK SPACE * ENDPROG EQU $ END OF PROGRAM END DEFSTR THAT'S ALL FOLKES!!! * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT MESSAGES (MISCELLANEOUS MESSAGES) ***************************** * * MISCELLANEOUS MESSAGES * ***************************** * EOT BYTE CR,LF,'END OF TESTS',CR,LF,0 * LPTIOT BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 TITL STACK ****************************** * * STACK SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe811117165442811117165442811117171631e@811117165442811117165442811117171629" e811117165442811117165442811117165442e811117165442811117165442811117165442811117165442811117165442811117165442eA8207011027207582070110273150811117171348eE*8207020315265082070203153025811117171616# $ % & ' ( ) * + . OKIDATA ASMOKIDATA JCL, IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII