IMD 1.16: 2/09/2008 10:28:41 84-93812-01 d100 async mux volume asyncmux asm asyncmux obj asyncmux bin asyncmux jcl    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF182022307313804820223073138 820223073138EASYNCMUX VOLASYNC MUX DIAG SOURCE AND BINARY VOL (84-93812-01-D100)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL ASYNC MUX DIAGNOSTIC 84-93812-10 D100 MACHINE :0020 * * EOB MACRO, FOR PRIMARY VECTORS * PEOB MACRO EOB#1 PUSH SSTAT COPY =#1,X SAVE CHAN# COPY TSTLPT,Y GET TEST LIST ADDRESS COPY 0(Y,X),A GET COMMAND TYPE CLSN A,=3 JMP $+2 XMT & RCV CLSN A,=1 JMP $+3 XMT ONLY COPY =RCVSTAT,Y SET RCV STATUS ADDRESS JMP EOB READ STATUS & SAVE COPY =XMTSTAT,Y SET XMT STATUS TABLE ADDRESS JMP EOB ENDM * * EOB MACRO, FOR SECONDARY VECTORS * SEOB MACRO EOBS#1 PUSH SSTAT COPY =#1,X SAVE CHAN # COPY =RCVSTAT,Y SET RCV STATUS ADDRESS JMP EOB ENDM ABS :0 NAM G:0 EXTR DEBUG4 JMP *$+1 WORD DEBUG4 * * POWER UP JUMP * ABS :80 JMP *$+1 WORD DEBUG4 GOTO DEBUG4 * * MEMORY EXCEPITON TRAP * ABS :88 WORD 0,0 JST *$+1 WORD MTRAP * * POWER DOWN ROUTINE * ABS :8C WORD 0,0 SAVE P-REG AND S-REG HLT * * RTC INTERRUPT ADDRESS * ABS :91 CLOCK WORD 0 JMP *$+1 CLKINT WORD TIMEOUT * * CONSOLE INTERRUPT * ABS :94 JST *$+1 WORD CONINT * * BURN IN TEST STARTS HERE * ABS :100 BURN EQU $ SBIT 4,S CONSOLE INTERRUPT ENABLE SBIT 8,S ENABLE CPU INTERRUPT COPY =STACK,A INITIALIZE STACK COPY A,K COPY =STACKE,A COPY A,L COPY =:7,A DEFAULT DEVICE ADDRESS SELP A,4 OUTPUT DEVICE ADDRESS TO CONSOLE COPY =4,Q DEFAULT CHANNEL NUMBER COPY =0,X DEFAULT, NO HALT ON ERROR C OPY PROGEND,Y DEFAULT INTERRUPT VECTORS BASE ADDRESS HLT COPY A,ADBAS SAVE DEVICE ADDRESS COPY Q,CHANL SAVE NO. OF CHANGES COPY X,HLTFLG HALT ON ERROR FLAG COPY Y,INTBAS SAVE INTERRUPT VECTOR ADDRESS JSK INITLST INITIALIZE DEFAULT LISITS COPY =1,A COPY A,PNTFLG SET NO ERROR PRINT FLAG COPY =0,A COPY A,TEKTST RESET TECH TEST FLAG JMP SETAIO * * MEMORY EXCEPTION TRAP ROUTINE * MTRAP ENT JSK NEWLIN COPY =MTPMSG,A JSK MSG PRINT MEMORY EXCEPTION TRAP JSK NEWLIN COPY =:AA,A OUTPUT TRAP INDICATOR TO CONSOLE SELP A,4 HLT HALT JMP RESTART RESTART PROGRAM LPOOL * * PROGRAM WITH CRT STARTS HERE * ABS :200 START EQU $ G:0 EQU $ COPY =1,A OUT A,0 SET SENSE SW. SBIT 4,S CONSOLE INTERRUPT ENABLE SBIT 8,S CPU INTERUPT ENABLE COPY =STACK,A COPY A,K COPY =STACKE,A COPY A,L COPY =0,A COPY A,PNTFLG RESET PRINT SUPPRESS FLAG * * GET TEST NUMBER * COPY =0,A COPY A,PASSCNT RESET PASS COUNTER COPY A,ERRCNT0 RESET ERROR COUNTER COPY A,ERRCNT1 JSK NEWLIN COPY =TITLE,A PRINT TITLE & REV. NO. JSK MSG DVA EQU $ JSK NEWLIN COPY =DVAMSG,A GET DEVICE ADDRESS JSK MSG JSK GETDV JEQ Q,$+3 JSK NEWLIN JMP DVA GET ADDRESS AGAIN COPY A,ADBAS SAVE DEVICE ADDRESS INTQRY JSK NEWLIN COPY =INTMSG,A GETT INTERRUPT BASE ADDRESS JSK MSG COPY =0,Q JSK HEXIN GET 1ST CHARACTER JNE Y,INTQRY REPEAT QUERY IF Y SET CLSN A,=:0D IS IT A CR? JMP DEFINT DEFAULT INT. ADDRESS COPY A,Q SAVE IT COPY =-3,X SET LOOP FOR 3 MORE CHAR. INTLP JSK HEXIN READ INPUT JNE Y,INTQRY CLSN A,=:0D IS IT DONE? JMP CHKINT SHIFT Q,L,4 SHIFT LAST CHAR. FOUR BITS LEFT OR A,Q COMBINE WITH CURRENT CHAR. ADD =1,X INC. COUNT JLT X,INTLP REPEAT JSK HEXIN JNE Y,INTQRY CLSN A,=:0D TERMINATED WITH CR? JMP CHKINT JMP INTQRY CHKINT COPY Q,A CHECK VALID INT. ADDR. AND =:7F,A JNE A,INTQRY COPY Q,A DOES INT. ADDRESS PASS PROGRAM END? AND =:E000,A JNE A,SAVINT JMP INTQRY DEFINT COPY PROGEND,Q DEFAULT INT. ADDRESS SAVINT COPY Q,INTBAS SAVE IT ADD =127,Q ADD 127 WORDS TO INT. BASE ADDRESS COPY Q,Y COPY Q,0(Y) TRAP IF NO MEMORY THERE CHNL EQU $ JSK NEWLIN COPY =CHLNO,A GET NO. OF CHANNELS JSK MSG JSK IKB CLSN A,=:0D IS IT DEFAULT? JMP STCHNL CLSN A,=:34  JMP CRCHK CLSN A,=:38 IS IT 8? JMP CRCHK JMP CHNL GET NO. AGAIN PASSCNT WORD 0 PASS COUNTER ERRCNT0 WORD 0 ERROR COUNTER ERRCNT1 WORD 0 ERROR COUNTER INTBAS WORD 0 HLTFLG WORD 0 LPOOL STCHNL EQU $ COPY =:4,A DEFAULT IS 4 CHANNEL COPY A,CHANL JMP HLTQRY CRCHK EQU $ AND =:F,A COPY A,CHANL SAVE NO. OF CHANNEL JSK IKB CLSN A,=:0D IS IT CR? JMP HLTQRY JMP CHNL HLTQRY EQU $ JSK NEWLIN COPY =HLTMSG,A PRINT HALT ON ERROR (Y/N)? JSK MSG JSK IKB CLSN A,=:0D IS IT CR? JMP $+3 CLSN A,=:59 IS IT 'Y'? JMP $+3 COPY =0,A JMP $+2 COPY =1,A COPY A,HLTFLG JMP QUERLP QUERLP EQU $ JSK NEWLIN COPY =QUERY,A PRINT TEST QUERIES  JSK MSG JSK IKB INPUT A BYTE FROM KEYBOARD CLSN A,=:0D IS IT A CR? JMP DEFAULT CLSN A,=:44 IS IT A 'D'? JMP DEFAULT CLSN A,=:47 IS IT A 'G'? JMP DEBUG4 CLSN A,=:54 IS IT A 'T'? JMP TECH CLSN A,=:52 IS IT A 'R'? JMP REPEAT JMP QUERLP GO BACK TO QUERY * * DEFAULT TEST * DEFAULT EQU $ JSK NEWLIN JSK INITLST INITIALIZE DEFAULT LISTS COPY =0,A COPY A,TEKTST RESET TECH TEST FLAG COPY A,PNTFLG SET ERROR FPRINT FLAG DEFTST JSK NEWLIN JMP SETAIO DO TEST * * TECH TEST* * TECH EQU $ COPY =0,A COPY  A,PNTFLG SET PRINT ERROR FLAG COPY =1,A COPY A,TEKTST TECH. TEST FLAG SETLIST EQU $ JSK NEWLIN TECHQ EQU $ COPY =TCHQRY,A SENT QUERY TO CRT JSK MSG COPY =TSTLST,X GET TEST LST ADDRESS COPY =TSTCNT,Y SET TOTAL NO. OF TESTS NEG Y JSK IKB GET CHARACTER CLSN A,=:0D IS IT A CR? JMP SETLIST INCHRLP EQU $ CSK A,='0' CHECK IF NUMERIC JMP CHKCR CHECK FOR CR OR COMMA NOP CSK A,='9' JMP STRBYTE STORE TEST NO. ON LIST JMP CHKALP CHECK ALPHANUMERIC STRBYTE EQU $ AND =:4F,A COPY A,Q AND =:40,Q JEQ Q,$+3 AND =:F,A ADD =9,A COPY A,0(X) JSK IKB GET NEXT CHARACTER JMP INCHRLP CHKCR EQU $ ADD =1,X INC. TEST LIST ADDRESS CLSN A,=:0D IS IT A CR? JMP CHLQRY CLSN A,=',' IS IT A COMMA? JMP $+2 JMP SETLIST REPEAT QUERY ADD =1,Y INC. TEST NO. COUNT JGE Y,CHLQRY JSK IKB GET NEXT CHAR. CLSN A,=',' JMP SETLIST REPEAT QUERY IF YES JMP INCHRLP CHKALP EQU $ CSK A,='A' CHECK RANGE,A-C JMP SETLIST NOP CSK A,='C' JMP STRBYTE JMP SETLIST JMP STRBYTE * TEKTST WORD 0 TECH TEST FLAG PNTFLG WORD 0 PRINT REQUEST FLAG LPOOL CHLQRY EQU $ COPY =-1,A SET END FLAG ON TEST LIST COPY A,0(X) COPY =CHNLST,X GET CHANNEL NO. LIST ADDR.  JSK NEWLIN COPY =CHLMSG,A INPUT CHANNEL NO. JSK MSG JSK HEXIN INPUT FIRST CHARACTER CLSN A,=:0D IS IT A CR? JMP DEFCHL JNE Y,CHLQRY ILLEGAL HEX CHARACTER COPY CHANL,Q GET NO. OF CHANNELS NEG Q CQRYLP CSK A,CHANL IS CHANNEL NO. VALID? JMP $+3 NOP JMP CHLQRY COPY A,0(X) SAVE CHANNEL NO. JSK HEXIN GET NEXT CHARACTER CLSN A,=:0D IS IT A CR? JMP INCHL CLSN A,=:2C IS IT A COMMA? JMP BMPCHL JNE Y,CHLQRY JMP CQRYLP BMPCHL ADD =1,X INC. LIST INDEX POINTER ADD =1,Q INC. CHANNEL NO. COUNT JGE Q,INCHL+1 JSK HEXIN GET NEXT CHARACTER CLSN A,=:0D JMP INCHL+1 JNE Y,CHLQRY INVALID CHANNEL NO. JMP CQRYLP CHECK VALIDITY OF CHANNEL NO. INCHL EQU $ ADD =1,X COPY =-1,A COPY A,0(X) SET END CHAN. LIST FLAG COPY =CHNLST,X INIT. CHANL. NO. LIST POINTER  COPY X,CHLPTR BAUDQRY EQU $ COPY =BAULST,X GET BAUD RATE LIST POINTER JSK NEWLIN COPY =BAUQRY,A INPUT BAUD RATES JSK MSG JSK DECIN JEQ Q,DEFBAU CR MEANS DEFAULT BAUD RATES CLSN Q,=:0D JMP BAUCHK JMP BAUDQRY BAUCHK EQU $ COPY A,0(X) SAVE BAUD RATE ON LIST ADD =1,X INC. LIST POINTER COPY =-1,A COPY A,0(X) SET END FLAG ON LIST COPY =BAULST,Y GET BAUD RATE LIST TABLE BAULP0 COPY =-16,A COPY A,BAUTTL INIT. TOTAL VALID BAUD RATES COPY =BAUTAB0,X INIT. VALID BAUD TBLE POINTER COPY 0(Y),A GET BAUD RATE FROM LIST JLE A,BAUOK BAULP1 CSK A,0(X) COMPARE WITH VALID BAUD RATE NOP JMP $+4 COPY 1(X),A GET BAUD RATE CODE COPY A,0(Y) SAVE CODE ON LIST JMP CHKNEXB CHECK NEXT BAUD RATE ADD =2,X INC. BAUD RATE TABLE POINTER IMS BAUTTL JMP BAULP1 JSK NEWLIN COPY =BADBAU,A PRINT BAD BAUD RATE JSK MSG JMP BAUDQRY RETURN TO BNAUD RATE QUERY CHKNEXB EQU $ ADD =1,Y BUMP BAUD RATE LIST POINTER JMP BAULP0 FECTH BAUD RATE FROM LIST BAUOK EQU $ JSK NEWLIN JMP SETAIO DEFCHL EQU $ JSK DEFCHAN SET DEFAULT CHAN# LIST JMP BAUDQRY GOTO BAUD RATE QUERY DEFBAU EQU $ JSK DEFBAUD SET DEFAULT BAUD RATES JMP DEFTST DO TEST * * REPEAT LAST TEST * REPEAT EQU $ JSK RCHANL JSK NEWLIN JMP SETAIO DOTEST EQU $ COPY =TSTLST,A INIT. TEST LIST POINTER COPY A,TSTPTR JSK NEWLIN COPY =BAULST,A INIT. BAUD RATE LIST POINTER COPY A,BAUPTR PRINT NO. OF PASSES COPY =PASSMSG,A JSK MSG COPY PASSCNT ,A JSK DECOUT TESTLP JSK NEWLIN COPY =TSTMSG,A PRINT TEST NO. JSK MSG COPY TSTPTR,X GET TEST LIST ADDRESS POINTER COPY 0(X),A JSK HEXOUT PRINT TEST NO. JSK NEWLIN SELP A,4 OUTPUT TEST NO. TO CONSOLE COPY A,X COPY =TSTAB,Y SET TEST TABLE ADDRESS COPY 0(Y,X),Y GET TEST ADDRESS JMP 0(Y) GOTO DO TEST LPOOL * * SET UP AUTO I/O INTERRUPT VECTORS * * PRIMARY VECTORS FOR TRANSMITTING IN FULL DUPLEX OR * TRANSMITTING & RECEIVING IN HALF DUPLEX * SETAIO EQU $ COPY =CHNLST,Y COPY =CHNLST1,X SETAIO0 COPY 0(Y),A GET CHAN# FROM 1ST LIST JLT A,SETAIO1 IS IT DONE YET? COPY A,0(X) PUT CHN# ONTO 2ND LIST ADD =1,Y INCREMENT POINTERS  ADD =1,X JMP SETAIO0 SETAIO1 COPY A,0(X) COPY =-16,Q SET UP 16 LOOPS COPY INTBAS,X GET INTERRUPT BASE ADDRESS COPY =EOBADR,Y GET EOB ADDRESS POINTER AIOLP EQU $ COPY =0,A RESERVE 4 WORDS FOR AIO, BYTE COUNT &POINTER COPY A,0(X) COPY =0,A COPY A,1(X) COPY =0,A COPY A,2(X) COPY =0,A COPY A,3(X) COPY =:FF80,A JSK *$+1 INSTRUCTION COPY A,4(X) COPY 0(Y),A GET EOB ADDRESS COPY A,5(X) COPY =0,A RESERVE SPACES COPY A,6(X) COPY A,7(X) ADD =8,X BUMP VECTOR ADDRESS ADD =1,Y BUMP EOB POINTER ADD =1,Q JLT Q,AIOLP JMP DOTEST LPOOL * * TEST 0 - PARTIAL RESET TEST * TEST0 EQU $ JSK RSTMUX RESET ASYNCMUX BOARD JSK PRSTMUX PARTIAL RESET MUX & CHECK STATUS JMP NXTST * * TEST 1 - VERIFY DEFAULT OPTION TABLE * TEST1 EQU $ JSK RSTMUX RESET ASYNCMUX BOARD COPY =CHNLST,X GET CHAN# LIST COPY X,CHLPTR1 SET UP POINTER TEST1A COPY 0(X),X GET CHANNEL NO. JLT X,TEST1B IS IT DONE?  COPY =OPTXMTP,Y COPY 0(Y,X),Y GET OPT. TABLE BUFFER ADDRESS SBIT 2,S SET BYTE MODE COPYB =:01,A SET UP DEFAULT VALUES FOR COMPARE COPYB A,0(Y) COPYB =:C9,A COPYB A,1(Y) COPYB =:3E,A COPYB A,2(Y) COPYB =:10,A COPYB A,3(Y) COPYB =:3B,A SAVE DEFAULT SPECIAL CHARACTERS COPYB A,4(Y) COPYB =:0D,A COPYB A,5(Y) RBIT 2,S SET WORD MODE ADD =4,Y BUMP TO NEXT TABLE IMS CHLPTR1 INC. POINTER TO NEXT CHANNEL NOP COPY CHLPTR1,X GET CHAN# JMP TEST1A DO IT AGAIN FOR NEXT CHANNEL TEST1B JSK ROPTAB READ & VERIFY OPTION TABLE JMP NXTST DO NEXT TEST * * TEST 2 - WRITE AND READ MODEM REGISTERS * TEST2 EQU $ JSK RSTMUX RESET ASYNCMUX BOARD JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT JSK WOPTAB COPY =:01,A COPY A,MDMREG SET DTR JSK WMOREG WRTIE MODEM REGISTER COPY =:09,A COPY A,RCVMSK EXPECTED MODEM REGISTER JSK RMOREG READ MODEM REGISTER COPY =:02,A COPY A,MDMREG SET RTS JSK WMOREG WRITE MODEM REGISTER COPY =:04,A COPY A,RCVMSK EXPECTED DATA JSK RMOREG READ MODEM REGISTER COPY =:03,A COPY A,MDMREG SET DTR,RTS JSK WMOREG WRITE MODEM REGISTER COPY =:0D,A COPY A,RCVMSK SET EXPECTED STATUS JSK RMOREG READ MODEM REG. COPY =:07,A COPY A,MDMREG SET DTR,RTS,AUX JSK WMOREG WRITE MODEM REGISTER COPY =:0F,A COPY A,RCVMSK SET EXPECTED STATUS JSK RMOREG READ MODEM REGISTER JMP NXTST DO NEXT TEST * * TEST 3 - WRITE AND READ OPTION TABLE TEST * TEST3 EQU $ JSK RSTMUX RESET ASYNCMUX BOARD JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT WRITE OPT. & WRITE MODEM REG. JSK ROPTAB READ OPT. TABLE JMP NXTST GOTO TO DO NEXT TEST * * TEST 4 - SEND SPECIAL CHARACTER & VERIFY BY READING OPTION TABLE * TEST4 EQU $ JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT WRITE OPT. & MODEM COPY =CHNLST,X COPY X,CHLPTR1 TEST4A COPY 0(X),X GET CHAN# JLT X,TEST4B IS IT DONE YET? C OPY =SCRPTR,Y COPY 0(Y,X),Y GET SPECIAL CHARS. BUFFER ADDRESS COPY 0(Y),Q GET SPECIAL CHAR. SHIFT Q,R,8 GET UPPER BYTE COPY =5,A JSK MOPTSET MODIFY OPT. TABLE COPY 0(Y),Q GET SPECIAL CHARACTER AGAIN AND =:FF,Q MASK OFF UPPER BYTE COPY =4,A JSK MOPTSET IMS CHLPTR1 NOP COPY CHLPTR1,X GET CHANL. LIST POINTER JMP TEST4A TEST4B COPY =WRSPC,Q COPY Q,CMDWD1 COPY =SCRPTR,A SET BUFFER POINTERS COPY A,BUFPTR0 COPY =2,A COPY A,BYTCNT SET BYTE COUNTS COPY =64,A COPY A,MODE SET 2ND VECTOR OFFSET COPY =TSTLST4,A SET TEST LIST POINTER COPY A,TSTLPT JSK PAIOB SET AUTO I/O BLOCKS COPY =ERRLST,Y SET ERROR TYPE COPY =1,A COPY A,0(Y) COPY =:07,A SET ERROR CODES COPY A,1(Y) COPY =NORXMT,A SET EXPECTED XMT STATUS COPY A,XMTMSK JSK SZETIME SET TIME-OUT INTERVAL JSK DOIT SEND COMMANDS& CHECK ERRORS JSK ROPTAB READ OPTION TABLE & VERIFY SPECIAL CHAR. JMP NXTST MODE WORD 0 CMDWD1 WORD 0 CMDWD2 WORD 0 CMDWD3 WORD 0 LPOOL * * TEST 5 - SEND CONTROL CHARACTER & RECEIVE RANGEW MACTH TEST * TEST5 EQU $ COPY =CTLCHR,X SET UP CONTROL CHAR. TABLE POINTER COPY X,CTLPT COPY 0(X),A JGE A,$+2 JMP NXTST JSK PRSTMUX PARTIAL RESET MUX  JSK STDOPT WRITE OPT TABLE & MOD. REG. COPY =RBUFPTR,A SET BUFFER PONITERS COPY A,BUFPTR1 COPY =XBUFPTR,A COPY A,BUFPTR0 COPY =ERRLST,Y COPY =:01,A COPY A,0(Y) SET UP ERROR CODES COPY =:9,A COPY A,1(Y) COPY =:A,A COPY A,2(Y) COPY =1,A COPY A,BYTCNT SET BYTE COUNTS JSK CLRBUF CLEAR RCV BUFFER COPY =RMRCV,A COPY A,RCVMSK SET EXPECTED RCV STATUS COPY =NORXMT,A COPY A,XMTMSK SET EXPECTED XMT STATUS COPY =RCVRM,Q SET RCV,RM COMMAND COPY Q,CMDWD2 COPY =64,A COPY A,MODE SET 2ND VECTOR OFFSET COPY =TSTLST2,A SET TEST LIST POINTER COPY A,TSTLPT COPY CTLPT,Y COPY 0(Y),Q GET CONTROL CHARACTER OR =WRCNC,Q COMBINE WITH SEND CONTROL CHAR. CMD. COPY Q,CMDWD1 JSK PAIOB SET AIO BLOCKS JSK SZETIME SET TIMEOUT INTERVAL JSK DOIT SEND COMMANDS & CHECK ERRORS IMS CTLPT INC. CONTROL CHAR. TABLE POINTER NOP COPY CTLPT,X JMP TEST5+2 DO IT WITH DIFFERENT CHAR. * * TEST 6 - SEND 'EOL' AND RECEIVE MESSAGE TEST * TEST6 EQU $ JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT WRITE OPT. TABLE & MODEM REG. COPY =RBUFPTR,A SET RCV BUFFER ADDR. POINTER COPY A,BUFPTR1 COPY =XBUFPTR,A SET XMT BUFFER POINTER COPY A,BUFPTR0 COPY =RDBUF,A SET RECEIVE COMMAND COPY A,CMDWD2 COPY =TSTLST2,A SET TEST LIST POINTER COPY A,TSTLPT COPY =ERRLST,Y COPY =:05,A COPY A,0(Y) SET ERROR TYPE COPY =:0B,A COPY A,1(Y) SET ERROR CODES COPY =:0E,A COPY A,2(Y) COPY =NORXMT,A SET EXPECTED XMT STATUS COPY A,XMTMSK COPY =NORRCV,A SET EXPECTED RCV STATUS COPY A,RCVMSK COPY =64,A SET SECONDARY VECTOR OFFSET COPY A,MODE COPY =33,Q COPY Q,BYTCNT SET BYTE COUNTS JSK CLRBUF CLEAR RCV BUFFER SUB =2,Q OR =WREOL,Q COMBINE WITH RCV COMMAND COPY Q,CMDWD1  JSK PAIOB SET UP AIO VECTOR BLOCKS JSK SZETIME SET UP TIME INTERVAL JSK DOIT SEND COMMANDS & CHECK ERRORS JMP NXTST GOTO DO NEXT TEST * * TEST 7 - SEND 'BREAK' TEST * TEST7 EQU $ COPY =BRKBUF,X COPY X,BRKPT SET UP 'BREAK' BUFFER POINTER COPY 0(X),A GET BREAK TIME JGE A,$+2 IS IT DONE? JMP NXTST JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT WRITE OPT. TABLE & MOD. REG. COPY =TSTLST4,A SET TEST LIST POINTER COPY A,TSTLPT COPY =NORXMT,A SET EXPECTED XMT STATUS COPY A,XMTMSK COPY =ERRLST,Y COPY =:01 ,A COPY A,0(Y) SET ERROR CODE & TYPE COPY =:0C,A COPY A,1(Y) COPY BRKPT,Y COPY 0(Y),Q GET BREAK DURATION DATA OR =WRBRK,Q COMBINE WITH SEND BREAK COMMAND COPY Q,CMDWD1 JSK SZETIME SET UP TIMEOUT INTERVAL JSK DOIT SEND COMMANDS AND CHECK ERRORS IMS BRKPT INC. 'BREAK' TABLE POINTER NOP COPY BRKPT,X JMP TEST7+2 DO IT AGAIN WITH DIFF. BREAKS LPOOL * * TEST 8 - FULL DUPLEX TRANSMIT AND RECEIVE MESSAGE TEST * TEST8 EQU $ JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT WRITE STD. OPT. TABLE & MOD. REG. COPY =RBUFPTR,A SET BUFFER ADDRESS POINTERS COPY A,BUFPTR1 COPY =XBUFPTR,A COPY A,BUFPTR0 COPY =NORXMT,A SET EXPECTED XMT STATUS COPY A,XMTMSK COPY =WRBUF,A SET TRANSMIT BUFFER COMMAND COPY A,CMDWD1 COPY =64,A COPY A,MODE SET SECONDARY VECTOR MODE  COPY =36,A SET 36 BYTES TO READ COPY A,BYTCNT JSK CLRBUF CLEAR RCV BUFFER COPY =NORRCV,A COPY A,RCVMSK SET EXPECTED RCV STATUS COPY =TSTLST2,A INIT. TEST LIST POINTER COPY A,TSTLPT COPY =ERRLST,Y SET ERROR TYPE COPY =:04,A COPY A,0(Y) COPY =:0D,A COPY A,1(Y) SET ERROR CODES COPY =:0E,A COPY A,2(Y) COPY =RDBUF,Q COPY Q,CMDWD2 SET RCV MESSAGE COMMAND JSK PAIOB SET AUTO AIO BLOCKS JSK SZETIME SET UP TIME OUT INTERVAL JSK DOIT SEND COMMANDS AND CHECK ERRORS JMP NXTST GOTO DO NEXT TEST * * TEST 9 - HALF DUPLEX RECEIVE AND TRANSMIT MESSAGE TEST. * FIRST ALL EVEN CHANNELS RECEIVE AND ODD CHANNELS TRANSMIT. *  THEN ALL EVEN CHANNELS TRANSMIT AND ODD CHANNELS RECEIVE. * TEST9 EQU $ COPY =:FFFE,A SET COUNTER FOR 2 PASSES COPY A,TEMPCNT COPY =TSTLST1,A COPY A,TSTLPT1 INITIALIZE TEST LIST POINTER TEST9LP JSK PRSTMUX PARTIAL RESET MUX JSK SETOPT SET UP STD. OPT. TABLE BUFFER COPY =CHNLST,X GET CHANNEL LIST ADDRESS COPY X,CHLPTR1 SET UP LIST POINTER TEST9A COPY 0(X),X GET CHAN#  JLT X,TEST9B IS IT DONE? COPY =0,Q SET HALF DUPLEX MODE COPY =0,A POINT TO 1ST BYTE OF OPT. TBALE JSK MOPTSET CHANGE OPT. TABLE TO HALF DUPLEX MODE IMS CHLPTR1 INC. POINTER NOP COPY CHLPTR1,X JMP TEST9A TEST9B JSK WOPTAB WRITE OPTION TABLE COPY =:07,A SET DTR,RTS& AUX COPY A,MDMREG JSK WMOREG WRITE MODEN REG. COPY =RBUFPTR,A SET UP BUFFER POINTERS COPY A,BUFPTR1 COPY =XBUFPTR,A COPY A,BUFPTR0 COPY =WRBUF,A SET COMMANDS COPY A,CMDWD1 COPY =RDBUF,A COPY A,CMDWD2 COPY =36,A SET BYTE COUNTS  COPY A,BYTCNT JSK CLRBUF CLEAR RCV BUFFER COPY =ERRLST,Y COPY =1,A SET ERROR TYPE COPY A,0(Y) COPY =:0F,A COPY A,1(Y) COPY =:10,A COPY A,2(Y) COPY =NORRCV,A COPY A,RCVMSK SET EXPECTED RCV STATUS COPY =NORXMT,A COPY A,XMTMSK SET EXPECTED XMT STATUS COPY TSTLPT1,A COPY A,TSTLPT COPY =0,A COPY A,MODE JSK PAIOB MODE JSK SZETIME SET TIME-OUT INTERVAL JSK DOIT SEND COMMANDS AND CHECK ERRORS IMS TEMPCNT INC. PASS COUNTER JMP $+2 JMP NXTST GOTO DO NEXT TEST COPY =TSTLST5,A IUSE NEW TEST LIST COPY A,TSTLPT1 JMP TEST9LP DO IT AGAIN * TEMPCNT WORD 0 TSTLPT1 WORD 0 LPOOL * * TEST B - LOCAL LOOPBACK ( SHOULD WORK WITH TEST CABLES REMOVED) * TEST10 EQU $ JSK PRSTMUX PARTIAL RESET MUX JSK SETOPT SET STD. OPT TABLE BUFFER COPY =CHNLST,X GET CHASNL. LIST ADDRESS COPY X,CHLPTR1 SET CHANL. LIST ADDRESS POINTER TEST10A COPY 0(X),X GET CHAN# JLT X,TEST10B IS IT DONE? COPY =:B7,Q SET LOCAL LOOP BACK MODE COPY =3,A POINT TO 4TH BYTE IN OPT. TABLE JSK MOPTSET MODIFY OPT. TABLE IMS CHLPTR1 INC. CHA NL. LIST POINTER NOP COPY CHLPTR1,X JMP TEST10A TEST10B JSK WOPTAB WRITE OPTION TABLE COPY =:07,A COPY A,MDMREG JSK WMOREG WRITE DTR,RTS TO MODREG COPY =RBUFPTR,A COPY A,BUFPTR1 SET UP RCV BUFFER POINTER COPY =XBUFPTR,A COPY A,BUFPTR0 SET XMT BUFFER POINTER COPY =WRBUF,A COPY A,CMDWD1 SET XMT BUFFER COMMAND COPY =RDBUF,A COPY A,CMDWD2 SET RCV BUFFER COMMAND COPY =36,A COPY A,BYTCNT SET BYTE COUNTS JSK CLRBUF CLEAR RCV BUFFER COPY =TSTLST2,A COPY A,TSTLPT SET TEST LIST ADDRESS. POINTER COPY =ERRLST,Y COPY =1,A COPY A,0(Y) SET ERROR TYPE COPY =18,A COPY A,1(Y) SET ERROR CODES COPY =21,A COPY A,2(Y) COPY =NORRCV,A COPY A,RCVMSK SET EXPECTED RCV STSTUS COPY =NORXMT,A COPY A,XMTMSK SET XMT STATUS COPY =64,A COPY A,MODE SET 2ND VECTOR OFFSET JSK PAIOB SET AUTO AIO BLOCKS JSK SZETIME SET ITME OUT INTERVAL JSK DOIT SEND COMMANDS AND CHECK ERRORS JMP NXTST GOTO NEXT TEST * * TEST C - AUTO ECHO TEST (HARDWARE) * TEST11 EQU $ COPY =:FFFE,A COPY A,TEMPCNT SET COUNTER FOR 2 PASSES COPY A,TEMPCNT COPY =TSTLST0,A COPY A,TSTLPT1 SET TEST LIST POINTER TEST11LP JSK PRSTMUX PARTIAL ERESET MUX JSK SETOPT SET STD. OPT. TABLE BUFFER COPY =CHNLST,X GET CHANL. LIST ADDRESS COPY X,CHLPTR1 SET LIST POINTER TEST11A COPY 0(X),X GET CHAN# JLT X,TEST11C IS IT DONE? COPY TSTLPT1,Y GET TEST LIST ADDRESS COPY 0(Y,X),A GET TYPE OF COMMANDS CLSN A,=3 IS IT XMT & RCV ? JMP TEST11B COPY =:77,Q SET AUTO ECHO MODE COPY =3,A POINT TO 4TH BYTE OF OPT. TABLE JSK MOPTSET TEST11B IMS CHLPTR1 INC. CHANL. LIST ADDR. POINTER NOP COPY CHLPTR1,X JMP TEST11A REPEAT TILL END LIST TEST11C JSK WOPTAB WRITE OPTION TABLE COPY =:07,A COPY A,MDMREG JSK WMOREG WRITE DTR,RTS TO MOD. REG. COPY =RBUFPTR,A COPY A,BUFPTR1 SET RCV BUFFER POINTER COPY =XBUFPTR,A COPY A,BUFPTR0 SET XMT BUFFER POINTER COPY =WRBUF,A COPY A,CMDWD1 SET TRANMIT BUFFER COMMAND COPY =RDBUF,A COPY A,CMDWD2 SET RECEIVE BUFFER COMMAND COPY =36,A COPY A,BYTCNT SET BYTE COUNTS JSK CLRBUF CLEAR RCV BUFFER COPY =ERRLST,Y COPY =1,A COPY A,0(Y) SET ERROR TYPE COPY =19,A SET ERROR CODES COPY A,1(Y) COPY =22,A COPY A,2(Y) COPY =NORRCV,A SET RCV STATUS COPY A,RCVMSK COPY =NORXMT,A COPY A,XMTMSK SET EXPECTED XMT STATUS COPY TSTLPT1,A COPY A,TSTLPT COPY =64,A COPY A,MODE SET SECONDARY VECTOR OFFSET JSK PAIOB SET AUTO I/O BLOCKS JSK SZETIME SET TIME OUT INTERVAL JSK DOIT SEND COMMANDS AND CHECK ERRORS IMS TEMPCNT INC. PASS COUNTER JMP $+2 JMP NXTST GOTO NEST TEST COPY =TSTLST6,A COPY A,TSTLPT1 SET NEW TEST LIST ADDRESS JMP TEST11LP DO IT AGAIN LPOOL * * TEST A - AUTO ECHO (FIRWARE) * TEST12 EQU $ COPY =:FFFE,A COPY A,TEMPCNT SET COUNTER FOR 2 PASSES COPY =TSTLST7,A COPY A,TSTLPT1 SET TEST LIST ADDRESS POINTER TEST12LP JSK PRSTMUX PARTIAL RESET MUX JSK STDOPT SET STD. OPT. TABLE BUFFER COPY =RBUFPTR,A COPY A,BUFPTR1 SET RCV BUFFER POINTER COPY =XBUFPTR,A COPY A,BUFPTR0 SET XMT BUFFER POINTER COPY =NORRCV,A COPY A,RCVMSK SET EXPECTED RCV STATUS COPY =NORXMT,A COPY A,XMTMSK SET EXPECTED XMT STATUS COPY =WRBUF,A SET COMMANDS COPY A,CMDWD1 COPY =RDBUF,A COPY A,CMDWD2 COPY =RCVAE,A AUTO ECHO COMMAND COPY A,CMDWD3 COPY =36,A COPY A,BYTCNT SET BYTE COUNT JSK CLRBUF CLEAR RCV BUFFER COPY =64,A COPY A,MODE SET SECONDARY VECTOR MODE COPY TSTLPT1,A COPY A,TSTLPT C OPY =ERRLST,Y COPY =4,A COPY A,0(Y) SET ERROR TYPE COPY =17,A COPY A,1(Y) SET ERROR CODES COPY =20,A COPY A,2(Y) JSK PAIOB SET AUTO I/O BLOCKS JSK SZETIME SET TIME OUT INTERVAL JSK DOIT SEND COMMANDS AND CHECK ERRORS IMS TEMPCNT INC. PASS COUNTER JMP $+2 JMP NXTST GO TO DO NEXT TEST COPY =TSTLST8,A COPY A,TSTLPT1 SET NEW TEST LIST ADDR. JMP TEST12LP * * LOOK AT BAUD RATE TABLE, FETCH NEW BAUD RATE AND REPEAT TEST. * JUMP TO NEXT TEST IF ALL BAUD RATES HAVE BEEN TESTED. * NXTST EQU $ COPY TSTPTR,X COPY 0(X),A GET TEST NO. CLSN A,=1 IS IT TEST 1 ? JMP NXTST1 IMS BAUPTR INC. BAUD RATE LIST POINTER NOP COPY BAUPTR,X GET BAUD RATE LIST ADDRESS POINTER COPY 0(X),A GET BAUD RATE JLT A,NXTST1 GOTO DO NEXT TEST COPY TSTPTR,X GET TEST LIST ADDRESS POINTER COPY 0(X),X GET TEST NO. GOTST COPY =TSTAB,Y GET TEST ADDRESS TABLE POINTER COPY 0(Y,X),Y GET TEST ADDRESS JMP 0(Y) GO THERE NXTST1 IMS TSTPTR GET TEST LIST ADDRESS NOP COPY TSTPTR,X COPY 0(X),X GET TEST NO. JLT X,TSTDNE COPY =BAULST,A INIT. BAUD RATE LSIT FOR NEXT TEST COPY A,BAUPTR GOTO DO NEXT TEST JMP TESTLP+1 GO THERE TSTDNE IMS PASSCNT IN.C PASS COUNTER NOP COPY =TLERR0,A PRINT TOTAL ERROR THIS PASS JSK MSG COPY ERRCNT0,A JSK DECOUT JSK NEWLIN COPY =TLERR1,A PRINT TOTAL ERROR, ALL PASSES JSK MSG COPY ERRCNT0,A ADD ERRCNT1,A SUM ERROR OF EACH PASSES COPY A,ERRCNT1 SAVE IT JSK DECOUT COPY =0,A COPY A,ERRCNT0 RESET PASS ERROR COUNTER JMP REPEAT * * TIME OUT SERVICE ROUTINE * TIMEOUT RBIT 5,S DISABLE RTC INTERRUPT POP RSK RETURN FROM LAST SUB. CALL * * CONSOLE INTERRUPT ESERVICE ROUTINE * CONINT ENT OUT A,1 RESET CONSOLE INTERRUPT COPY =0,A COPY ADBAS,Q SHIFT Q,L,4 ADD =4,Q XNX Q SELP A,ADSEL RESET MUX JSK RCHANL RESTART COPY PNTFLG,A IS IT BURN-IN TEST? JNE A,$+2 JMP START JMP BURN LPOOL * * COMMON EOB ROUTINE, Y=STATUS ADDRESS, X=CHAN# * EOB EQU $ COPY ADBAS,A SHIFT A,L,4 SHIFT X,L,1 OR X,A XNX A IN DAFC,A READ STATUS SHIFT X,R,1 COPY A,0(Y,X) SAVE STATUS POP RSK * * SUBROUTINE TO SET UP DEFAULT TEST LIST, CHANNEL NO. LIST * AND BAUD LIST * INITLST EQU $ PUSH SSTAT COPY =TSTCNT,Y SET 13 TESTS NEG Y COPY =TSTLST,X GET TEST LST POINTER COPY =0,A INIT. TEST NUMBER WRLST COPY A,0(X) SET LIST UP ADD =1,A INC. TEST NO. ADD =1,X INC. TEST TEST POINTER IJNE Y,WRLST INC. TEST NO. COUNT COPY =-1,A SET END LIST FLAG COPY A,0(X) COPY =TSTLST,A COPY A,TSTPTR JSK DEFCHAN JSK DEFBAUD POP RSK * * SUBROUINTE TO INITIALIZE DEFAULT CHANNEL NUMBERS * DEFCHAN EQU $ PUSH SSTAT  COPY CHANL,Y GET NO. OF CHANNELS NEG Y COPY =CHNLST,X GET CHANL. LIST ADDR. POINTER COPY =0,A CHLOOP COPY A,0(X) SET UP CHANNEL NO. LIST ADD =1,A ADD =1,X INC. LIST POINTER IJNE Y,CHLOOP INC. COUNT COPY =-1,A COPY A,0(X) SET END FLAG POP RSK * * SUBROUTINE TO SET UP DEFAULT BAUD RATES ON THE TABLE, 'BAULST' * DEFBAUD EQU $ PUSH SSTAT COPY CHANL,A GET NO. OF CHANNELS CLSN A,=8 IS IT 8 CHANNEL ? JMP $+3 COPY =DBAUD,X GET DEFAULT BAUD RATES ADDRESS JMP $+2 COPY =DBAUD+1,X COPY =BAULST,Y GET BAUD RATE TABLE ADDRESS DEFB1 COPY 0(X),A GET BAUD RATE JLT A,DEFB2 COPY A,0(Y) SAVE BAUD RATE ON LIST ADD =1,X ADD =1,Y BUMP POINTERS JMP DEFB1 DEFB2 COPY A,0(Y) SET END FLAG POP RSK * * * SUBROUTINE TO GET DEVICE ADDRESS * UPON RETURN: (A) =DEVICE ADDRESS * (Q)=ERROR FLAG IF SET * GETDV EQU $ PUSH SSTAT COPY K,X GET STACK POINTER JSK HEXIN GET CHARACTER CLSN A,=:0D IS IT A CR? JMP DEFDV JNE Y,BADDV JEQ A,BADDV VALID DEVICE ADDR. :1-:F? COPY A,Q SAVE THE HEX NO. JSK HEXIN CLSN A,=:0D IS IT A CR? JMP $+2 JMP BADDV SETDV COPY Q,AREG(X) PUT DEVICE ADDRESS IN A COPY =0,Q JMP $+2 BADDV COPY =1,Q INVALID ADDRESS FLAG COPY Q,QREG(X) POP RSK DEFDV COPY =:07,Q DEFAULT DEVICE ADDRESS JMP SETDV * * SUBROUTINE TO READ KEYBOARD INPUT AND CHANGE ASCII TO HEX * UPON RETURN: (A)=HEX CHARACTER * (Y)=ERROR FLAG IF SET * HEXIN EQU $ PUSH SSTAT COPY K,X GET STACK POINTER COPY =0,Y RESET ERROR FLAG JSK IKB INPUT A BYTE CLSN A,=:0D IS IT A CR? JMP HEXDONE CSK A,=:30 CECK RANGE 0-9 JMP BADHEX NOP CSK A,=:39 JMP $+2 JMP HEXCHR AND =:F,A JMP HEXDONE HEXCHR EQU $ CSK A,=:41 CHECK RANGE A-F JMP BADHEX NOP CSK A,=:46 JMP $+2 JMP BADHEX AND =:F,A ADD =9,A JMP HEXDONE BADHEX COPY =1,Y HEXDONE COPY A,AREG(X) PASS PARAMETERS TO STACK COPY Y,YREG(X) STACK POP RSK AREG EQU 2 QREG EQU 3 XREG EQU 4 YREG EQU 5 LPOOL * * * SUBROUTINE TO MODIFY THE OPTION TABLE BUFFERS * ON ENTRY: (Q)=BITS TO BE SET * (A)=BYTE POSITION OF BUFFER * (X)=CHANNEL NUMER * MOPTSET EQU $ PUSH SSTAT COPY =OPTXMTP,Y SET BUFFER ADDRESS POINTER COPY 0(Y,X),Y GET BUFFER ADDRESS COPY A,X GET BYTE POSITION SBIT 2,S SET BYTE MODE COPYB Q,0(Y,X) PUT DATA THERE RBIT 2,S SET WORD MODE POP RSK * * SUBROUTINE TO PERFORM AN OUTPUT FUNCTION * ON ENTZY: KMLWL1=XMT COMMAND * CMDWD2=RCV COMMAND * CMDWD3=OTHER COMMAND *  TSTLPT=TEST LIST ADDRESS POINTER OUTOP EQU $ PUSH SSTAT COPY =CHNLST,X COPY X,CHLPTR1 INITIALIZE CHANL. LIST P]OINTER LOOP8 COPY 0(X),X GET CHAN# JLT X,OUTDNE COPY TSTLPT,Y COPY 0(Y,X),A AND =4,A JEQ A,$+3 COPY CMDWD3,Q JMP OUTOP3 COPY 0(Y,X),A GET TYPE OF COMMAND AND =2,A IS IT RCV ? JEQ A,OUTOP1 COPY CMDWD2,Q GET COMMAND JSK DEVADR CALCULATE DEVICE ADDRESS XNX A OUT Q,DAFC SEND COMMAND OUTOP1 COPY 0(Y,X),A AND =1,A IS IT XMT? JEQ A,OUTOP2 COPY CMDWD1,Q OUTOP3 JSK DEVADR XNX A OUT Q,DAFC OUTOP2 IMS CHLPTR1 NOP COPY CHLPTR1,X JMP LOOP8 OUTDNE POP RSK * * SUBROUTINE TO FORM DEVICE ADDRESS OF A PARTICULAR CHANNEL * ON ENTRY: (X)=CHANNEL NUMBER *ON RETURN: (A)=DEVICE ADDRESS * DEVADR EQU $ PUSH SSTAT COPY ADBAS,A GET DE^IKE  ALDZE[S SHIFT A,L,4 SHIFT X,L,1 OR X,A COMBINE WITH CHAN# COPY K,X COPY A,AREG(X) POP RSK * * SUBROUTINE TO READ STATUS OF ALL CHANNELS ON THE CHANNEL LSIT * RDSTAT EQU $ PUSH SSTAT COPY =RCVSTAT,Q COPY =XMTSTAT,Y INIT. STATUS LIST POINTERS COPY =CHNLST,X COPY X,CHLPTR1 INIT. CHANNEL LIST POINTER LOOP9 COPY 0(X),X GET CHAN# JLT X,RDSDNE JSK DEVADR XNX A IN DAFC,A READ STATUS COPY A,0(Y,X) EXCH Q,Y COPY A,0(Y,X) EXCH Q,Y IMS CHLPTR1 INC. CHANL. LIST POINTER NOP COPY CHLPTR1,X JMP LOOP9 RDSDNE POP RSK * * SUBROUTINE TO PARTIALLY RESET BOTH XMT & RCV HALF CHANNELS * AND PERFORM STATUS CHECK * PRSTMUX EQU $ PUSH SSTAT COPY =RSTXMT,Q GET RESET XMT COMMAND COPY Q,CMDWD1 COPY =RSTRCV,Q COPY Q,CMDWD2 SET RESET RCV COMMAND COPY =TSTLST2,Q SET TEST LIST ADDR. POINTER COPY Q,TSTLPT COPY =0,A COPY A,CLOCK JSK OUTOP RESET CHANNELS JSK RDSTAT READ STA  TUS COPY =CHNLST,X COPY X,CHLPTR1 PRST0 COPY 0(X),X GET CHANNEL NO. JLT X,PRST1 COPY =XMTSTAT,Y SET XMT STATUS ADDRESS COPY 0(Y,X),A GET STATUS AND =:2000,A LOOK AT XMT BUSY BIT ONLY COPY A,0(Y,X) COPY =RCVSTAT,Y SET RCV STATUS ADDRESS COPY 0(Y,X),A GET STATUS AND =:1000,A COPY A,0(Y,X) IMS CHLPTR1 NOP COPY CHLPTR1,X JMP PRST0 PRST1 COPY =ERRLST,Y COPY =1,A SET ERROR TYPES COPY A,0(Y) COPY =0,A COPY A,1(Y) SET ERROR CODES COPY =1,A COPY A,2(Y) COPY =TXBSY,A COPY A,XMTMSK COPY =RXBSY,A COPY A,RCVMSK SET EXPECTED STATUS JSK ERRCHK CHECK FOR ERRORS POP RSK LPOOL * * SUBROUTINE TO SET UP STANDARD TEST OPTION TABLES * FOR ALL CHANNELS LISTED ON 'CHNLST' SETOPT EQU $ PUSH SSTAT COPY =CHNLST,X GET CHANL. LIST ADDRESS COPY X,CHLPTR1 SET LI[T POINTMR SETOPLP COPY 0(X),X GET CHAN# JLT X,OPTDNE IS IT DONE? COPY =OPTXMTP,Y GET OPT. TABLE XMT BUFFER POINTER COPY 0(Y,X),Y GET BUFFER ADDRESS COPY =OPTDEF,X GET DEFAULT OPT. TABLE ADDRESS COPY 0(X),A COPY A,0(Y) SAVE IN BUFFER COPY 1(X),A COPY A,1(Y) COPY =:3B0D,A DEFAULT SPECIAL CHARACTER COPY A,2(Y) COPY BAUPTR,X GET BAUD RATE LIST POINTER COPY 0(X),A GET BAUD RATE COPY =2,X POINT TO 3RD BYTE POSITION SBIT 2,S SET BYTE MODE COPYB A,0(Y,X) SAVE BAUD RATE IN OPT. TABLE RBIT 2,S SET WORD MODE IMS CHLPTR1 NOP COPY CHLPTR1,X GET CHANL. LIST ADDRESS JMP SETOPLP OPTDNE POP RSK * * * SUBROUTINE TO CLEAR RCV STATUS TABLE * CLRSTA EQU $ PUSH SSTAT COPY =-16,Q COPY =RCVSTAT,Y COPY =0,X CLRSTA1 COPY =-1,A COPY A,0(Y,X) ADD =1,X IJNE Q,CLRSTA1 POP RSK * * SUBROUTINE TO CLEAR XMT STATUS TABLE * CLXSTA EQU $ PUSH SSTAT COPY =-16,Q INIT. 16 COUNT COPY =XMTSTAT,Y GET STATUS TABLE POINTERS COPY =0,X INIT. CHAN# CLXSTA1 COPY =-1,A COPY A,0(Y,X) ADD =1,X INC. CHAN# IJNE Q,CLXSTA1 INC. COUNT POP RSK * * SUBROUTINE TO CHECK XMT STATUS * ON ENTRY: (X) CHANNEL NUMBER * ON RETURN: (A)=ERROR FLAG IF SET * XMTCHK EQU $ PUSH SSTAT COPY =0,A COPY A,BUFERR RESET BUFFER MISCOMP. FLAG COPY TSTLPT,Y COPY 0(Y,X),A GET COMMAND TYPE AND =1,A IS IT XMT? JEQ A,RCVOK JSK BUFCHK CHECK BUFFER JNE A,RCVOK-1 COPY =XMTSTAT,Y COPY =-1,A CSK A,0(Y,X) HAS STATUS BEEN UPDATED? NOP JMP $+2 JMP RCVOK-1 COPY 0(Y,X),A XMT ACTUAL XMT STATUS AND =:2F00,A COPY A,0(Y,X) AND =:2C00,A CSK A,XMTMSK COMPARE WITH EXPECTED STATUS NOP JMP RCVOK-1 JMP STATOK * * SUBROUTINE TO CHECK RCV STATUS * ON ENTRY: (X)=CHANNEL * UPON RETURN: (A)=ERROR FLAG IF SET * RCVCHK EQU  $ PUSH SSTAT COPY =0,A COPY A,BUFERR RESET BUFERR MISCOMPARED FLAG COPY TSTLPT,Y COPY 0(Y,X),A GET COMMAND TYPE AND =2,A IS IT RCV ? JEQ A,RCVOK JSK BUFCHK JNE A,RCVOK-1 COPY =RCVSTAT,Y COPY =-1,A CSK A,0(Y,X) HAS STATUS  BEEN UPDATED NOP JMP $+2 JMP RCVOK-1 COPY 0(Y,X),A GET ACTUAL RCV STATUS COPY ERRLST,Q GET ERROR TYPE CLSN Q,=2 IS IT TYPE TWO? JMP RCVCHK1 AND =RREGMSK,A COPY A,0(Y,X) AND =:10E0,A RCVCHK2 CSK A,RCVMSK NOP JMP $+3 STATOK COPY =0,A JMP $+2 COPY =1,A RCVOK COPY K,X COPY A,AREG(X) POP RSK RCVCHK1 AND =:F,A COPY A,0(Y,X) JMP RCVCHK2 * BUFERR WORD 0 LPOOL * * SUBROUTINE TO SET UPP APPROPRIATE DATAS IN AUTO I/O BLOCKS * ON ENTRY: (X)=ADDRESS OF 'CHNLST' * ON RET  URN: (X)=CHANNEL NUMBER} * RFAIOB EQU $ PUSH SSTAT COPY =8,Q CALCULATE AUTO I/O BLOCK ADDRESS MUL 0(X),AQ COPY INTBAS,Y GET INTERRUPT VECTOR BASE ADDRESS ADD Q,Y COPY 0(X),X GET CHAN# JSK DEVADR FORM DEVICE ADDRESS COPY AIOINST,Q OR Q,A COMBINE WITH INSTRUCTION COPY A,0(Y) SAVE IN BLOCK COPY BYTCNT,A NEG A MAKE BYTCNE NEGATIVE COPY A,1(Y) COPY BUFPTR,A GET BUFFER ADDRESS TABEL POINTER ADD A,X FORM BUFFER ADDRESS POINTER COPY 0(X),A GET BUFFER ADDRESS SHIFT A,L,1 FORM BYTE ADDRESS-1  SUB =1,A COPY A,2(Y) STORE IT COPY CHLPTR1,X COPY 0(X),A GET CHANNEL NO. COPY K,X COPY A,XREG(X) POP RSK LPOOL * * SUBROUTINE TO SET UP AUTO I/O BLOCKS * ON ENTRY: 'BYTCNT'=NO. OF BYTES FOR TRANSFERING * 'BUFPTR0'=XMT BUFFER ADDRESS POINTER * 'BUFPTR1'=RCV BUFFER ADDRESS POINTER * 'MODE'=64 FOR FULL DUPLEX, =0 FOR HALF DUPLEX * PAIOB EQU $ PUSH SSTAT COPY =CHNLST,X SET CHANL. LIST ADDRESS POINTER COPY X,CHLPTR1 LOOP11 COPY 0(X),X GET CHAN# JLT X,PAOBDN IS IT DONE? COPY TSTLPT,Y COPY 0(Y,X),A GET COMMAND TY PE FROM TEST AND =1,A IS IT XMT? JEQ A,PAIOB1 COPY =AOB,A COPY A,AIOINST SET AOB INSTRUCTION COPY BUFPTR0,A COPY A,BUFPTR SET BUFFER ADDRES TABLE POINTER COPY CHLPTR1,X COPY =0,A JSK RFAIOB SET IT UP PAIOB1 COPY TSTLPT,Y GET LIST ADDRESS COPY 0(Y,X),A GET COMMAND TYPE AND =2,A IS IT RCV? JEQ A,PAIOB2 COPY =AIB,A COPY A,AIOINST COPY BUFPTR1,A COPY A,BUFPTR COPY CHLPTR1,X COPY MODE,A JSK RFAIOB SET IT UP PAIOB2 IMS CHLPTR1 INC. CHAN# POINTER NOP COPY CHLPTR1,X JMP LOOP11 LPOOL PAOBDN POP RSK * AOB EQU :6500 AIB EQU :4500 LPOOL * * SUBROUTINE TO DETERMINE THE TIME-OUT INTERVAL TO BE USED * SZETIME EQU $ PUSH SSTAT COPY =4,A INIT. 4 SEC TIME OUT COPY =8,Q CSK Q,CHANL HOW MANY CHANNEL? JMP $+3 NOP JMP $+2 SHIFT A,R,1 CHANGE TO 2 SEC. COPY TEKTST,Q GET TECH TEST FLAG JEQ Q,SZEDONE COPY =BAULST,X GET BAUD RATE LIST TABLE ADDRESS LOOP4 COPY 0(X),Q JLT Q,SZEDONE LOOK AT END FLAG COPY =:31,Q CSK Q,0(X) COMPARE WITH 75 BAUD JMP TIME8 REQUIRE 8 SEC. TIMEOUT JMP $+2 JMP TIME6 REQUIRE 6 SEC. TIME OUT ADD =1,X INC. POINTER JMP LOOP4 TIME8 COPY =8,A 8 SEC. TIME-OUT JMP SZEDONE TIME6 COPY =6,A 6 SEC. TIME OUT SZEDONE COPY A,Q COPY =0,A MUL ONESEC,AQ MULT. BY 120 TICKS COMP Q COPY Q,CLOCK STORE IN RTC TIME CELL POP RSK LPOOL * ONESEC WORD 120 120 TICKS * * SUBROUTINE TO REDUCE TIME-OUT INTERVAL BY HALF FOR * WRITE OR READ OPTION TABLE OPERATION * HALFTIM EQU $ PUSH SSTAT COPY CLOCK,Q GET TICKS FROM CELL COMP Q SHIFT Q,R,1 DIVIDE IT BY TWO COMP Q COPY Q,CLOCK STORE IT BACK IN TIME CELL POP RSK * * SUBROUTINE TO EXAMINE THE STATUS OF EACH CHANNEL & LOOP * UNTIL ALL BUSY FLAGS ARE GONE OR TIME-OUT OCCURES. * EXAMSTA EQU $ PUSH SSTAT LOOP7 COPY =CHNLST,X COPY X,CHLPTR1 SET CHANL. LIST ADDRESS POINTER EXAMLP COPY 0(X),X GET CHAN# JLT X,EXRSTA COPY TSTLPT,Y COPY 0(Y,X),A GET TEST COMMAND TYPE AND =1,A IS IT XMT? JEQ A,EXAM1 COPY =XMTSTAT,Y COPY =-1,A CSK A,0(Y,X) IS XMT STATUS STILL NOT CHANGED NOP JMP $+2 JMP LOOP7 STATUS HAS NOT KHINOEL EXAM1 COPY TSTLPT,Y COPY 0(Y,X),A GET COMMAND TYPE AND =2,A IS IT RCV? JEQ A,EXRSTA1 COPY =RCVSTAT,Y GET POINTER OF 2ND STATUS LIST COPY =-1,A CSK A,0(Y,X) IS STATUS STILL NOT CHANGED  ? NOP JMP EXRSTA1 JMP LOOP7 STATUS HAS NOT CHANGED EXRSTA1 IMS CHLPTR1 INC. CHANL. POINTER NOP COPY CHLPTR1,X JMP EXAMLP LOOKK AT STATUS OF NEXT CHANNEL EXRSTA POP RSK * * SUBROUTINE TO COMPARE TWO BUFFER CONTENTS. * UPON RETURN: 'BUFERR' SETS FOR ERROR ,RESETS FOR NO ERROR * BUFCHK EQU $ PUSH SSTAT COPY =RCVSTAT,Y GET RCV STATUS TABLE ADDRESS COPY =-1,A CSK A,0(Y,X) EOB INTERRUPT? NOP JMP $+2 JMP BCHKRET NO EOB INTERRUPT COPY ERRLST,A GET ERROR TYPE CLSN A,=3 IS IT TYPE 3? JMP ERTYP3 CLSN A,=4 IS IT TYPE 4? JMP ERTYP4 CLSN A,=5 IS IT TYPE 5? JMP ERTYP5 BCHKRET COPY =0,A COPY A,BUFERR ERBUF COPY K,X COPY A,AREG(X) POP RSK CHKBUF JSK COMPBUF COMPARE THE BUFFERS JEQ A,BCHKRET NO BUFFER ERROR JMP ERBUF ERTYP3 COPY TSTLPT,Y COPY 0(Y,X),A GET COMMAND TYPE AND =2,A IS IT RCV? JEQ A,BCHKRET COPY =OPTRCVP,Y GET RCV. OPT. TABLE BUFFER POINTER COPY 0(Y,X),A GET RCV. OPT. TABLE BUFFER ADDRESS COPY =OPTXMTP,Y GET XMT OPT. TABLE BUFFER POINTER COPY 0(Y,X),Y GET XMT OPT. TABLE BUFFER ADDRESS COPY =6,Q NO. OF BYTES TO COMPARE JMP CHKBUF ERTYP4 COPY =RBUFPTR,Y GET RCV. DATA BUFFER POINTER COPY 0(Y,X),A GET RCV DATA BUFFER ADDRESS COPY =XBUFPTR,Y GET XMT ADATA BUFFER POINTER COPY 0(Y,X),Y GET XMT DATA BUFFER ADDRESS COPY BYTCNT,Q SET NO. OF BYTES TO COMPARE JMP CHKBUF ERTYP5 COPY =RBUFPTR,Y GET RCV DATD BUFFER POINTER COPY 0(Y,X),A GET RCV DATA BUFFER ADDRESS COPY =EOLBUF,Y GET EOL BUFFER ADDRESS COPY BYTCNT,Q JMP CHKBUF * * SUBROUTINE TO COMPARE BUFFERS * ON ENTRY: (A)= 1ST BUFFER ADDRESS * (Y)= 2ND BUFFER ADDRESS * (Q)=NO. OF BYTES TO COMPARE * UPON RETURN: (A)=BUFFER MISCOMPARED ERROR IF SET * COMPBUF EQU $ PUSH SSTAT JEQ Q,BCHKRET NO COMPARSION IF BYTE COUNT=0 EXCH Q,X X REG. BECOMES BYTE POINTER COMPLP SUB =1,X DECREMENT BYTE POINTER SBIT 2,S SET BYTE MODE EXCH Y,A COPYB 0(Y,X),Q FETCH A BYTE FROM 1ST BUFFER EXCH A,Y SUBB 0(Y,X),Q COMPARE WITH 2ND BUFFER RBIT 2,S JEQ Q,COMPOK COPY =1,A COPY A,BUFERR JMP ERBUF COMPOK JLE X,BCHKRET JMP COMPLP DLYCNT WORD :E000 DELAY COUNT STORAGE LPOOL * * SUBROUTINE TO CHECK STATUS AND REPORT ERRORS * ERRCHK EQU $ PUSH SSTAT COPY DLYCNT,A IJNE A,$ DELAY TO ENSURE ALL STATUS HAVE BEEN SETTLED COPY =CHNLST,X INIT. CHANL. LIST ADDRESS POINTER COPY X,CHLPTR ERRKLP COPY 0(X),X GET CHAN# JGE X,$+2 JMP ERRCHK10 JSK XMTCHK CHECK XMT STATUS JEQ A,ERRCHK1 COPY =CNLMSG,A PRINT CHANNEL NO. JSK MSG COPY X,A JSK DECOUT JSK NEWLIN JSK PBAUD PRINT BAUD RATE COPY =ERRNUM,A JSK MSG COPY =ERRLST+1,Y GET ERROR # COPY 0(Y),A JSK DECOUT PRINT ERROR # COPY =ERRTAB,Y ERROR MESSAGE TABLE POINTER ADD A,Y COPY 0(Y),A JSK MSG PRINT ERROR MMSSAGE COPY A,Q Q=ERROR MESSAGE ADDRESS COPY =FAILMSG,A JSK MSG JSK NEWLIN IMS ERRCNT0 NOP IN 4,A READ CONSOLE REGISTER OR =:1000,A SELP A,4 OUTPUT ERROR INIKATOR TO CONSOLE COPY HLTFLG,A JEQ A,$+2 HLT ERROR HALT,Q=ERROR MSG. ADDRESS, X=CHAN# COPY =XMTSTAT,Y GET XMT STATUS POINTER COPY =-1,A CSK A,0(Y,X) IS STATUS =-1? NOP JMP ERRCHK0 COPY =ERR2,A PRINT NO EOB INTERRUPT JSK MSG COPY A,Q Q=ERROR MESSAGE ADDRESS JSK NEWLIN IN 4,A READ CONSOLE REGISTER OR =:1000,A SELP A,4 OUTPUT ERROR INDICATOR TO CONSOLE COPY HLTFLG,A JEQ A,$+2 HALT ON ERROR  REQUESTED? HLT ERROR HALT NO EOB INTERRUPT ERRCHK0 JSK RCVCHK CHECK RCV STATUS JEQ A,$+2 JMP ERRCHK2  JMP ERRCHK3 ERRCHK1 JSK RCVCHK CHECK RCV STATUS JNE A,$+2 JMP NOERR+1 COPY =CNLMSG,A JSK MSG COPY X,A PRINT CHAN# JSK DECOUT JSK NEWLIN JSK PBAUD PRINT BAUD RATE ERRCHK2 COPY =ERRNUM,A JSK MSG COPY =ERRLST+2,Y COPY 0(Y),A GET ERROR CODE JSK DECOUT PRINT ERROR CODE COPY =ERRTAB,Y ADD A,Y COPY 0(Y),A A=ERROR MESSAGE ADDRESS JSK MSG PRINT ERROR MESSAGFE COPY A,Q Q=ERROR MESSAGE ADDRESS COPY =FAILMSG,A JSK MSG JSK NEWLIN IMS ERRCNT0 INC. ERROR COUNTER NOP IN 4,A READ CONSOLE OR =:1000,A SELP A,4 OUTPUT ERROR INDICATOR TO CONSOLE COPY HLTFLG,A JEQ A,$+2 HLT ERROR HALT, Q=ERROR ADDRESS MESSAGE, X=CHNA#  COPY =RCVSTAT,Y COPY =-1,A CSK A,0(Y,X) IS RCV STATUS =-1? NOP JMP ERRCHK3 JMP ERRCK22 LPOOL ERRCK22 COPY =ERR2,A PRIONT NO EOB INTERRUPT JSK MSG COPY A,Q Q=ERROR MESSAGE ADDRESS JSK NEWLIN IMS ERRCNT0 NOP IN 4,A READ CONSOLE OR =:1000,A SELP A,4 OUTPUT ERROR INDICATOR TO CONSOLE COPY HLTFLG,A JEQ A,$+2 HLT NO EOB INTERRUPT, X=CHAN# ERRCHK3 COPY TSTLPT,Y  COPY 0(Y,X),A GET TYPE OF COMMAND AND =1,A IS IT XMT? JEQ A,ERRCHK4 COPY =XMTSE,A JSK MSG COPY XMTMSK,A JSK HEXOUT PRINT EXPECTED XMT STATUS JSK NEWLIN COPY =XMTS,A JSK MSG COPY =XMTSTAT,Y COPY 0(Y,X),A JSK HEXOUT PRINT ACTUAL XMT STATUS JSK NEWLIN ERRCHK4 COPY TSTLPT,Y COPY 0(Y,X),A AND =2,A IS IT RCV? JEQ A,ERRCHK5 COPY =RCVSE,A JSK MSG COPY RCVMSK,A JSK HEXOUT PRINT EXPECTED RCV STATUS JSK NEWLIN COPY =RCVS,A JSK MSG COPY =RCVSTAT,Y COPY 0(Y,X),A JSK HEXOUT PRINT ACTUAL RCV STATUS JSK NEWLIN ERRCHK5 COPY ERRLST,A GET ERROR TYPE CLSN A,=2 TYPE 2 ERROR ? JMP ERRCHK6 CLSN A,=3 TYPE 3 ERROR ? JMP ERRCHK7 CLSN A,=4 TYPE 4 ERROR ? JMP ERRCHK8 CLSN A,=5 TYPE 5 ERROR ? JMP ERRCHK9 JMP NOERR ERRCHK6 COPY TSTLPT,Y COPY 0(Y,X),A GET COMMAND TYPE AND =2,A IS IT RCV? JNE A,$+2 JMP NOERR COPY =EXPMSG,A PRINT EXPECT MOD. REG. JSK MSG COPY =MRGMSG,A JSK MSG COPY RCVMSK,A GET MOD. REG. BUFFER POINTER JSK HEXOUT PRINT EXPECTED MOD. REG. JSK NEWLIN COPY =ACTMSG,A PRINT ACTUAL MOD. REG. JSK MSG COPY =MRGMSG,A JSK MSG COPY =RCVSTAT,Y GET ACTUAL MOD. REG BUFFER ADDRESS COPY 0(Y,X),A GET ACTUAL MOD. REG DATA JSK HEXOUT PRINT ACTUAL MOD. REG. JSK NEWLIN JMP NOERR ERRCHK7 COPY BUFERR,A BUFFER ERROR IN TYPE 3? JEQ A,$-2 COPY =EXPMSG,A JSK MSG COPY =OPTBMSG,A JSK MSG COPY =OPTXMTP,Y COPY 0(Y,X),X GET EXPECTED OPT. TABLE ADDRESS COPY =3,Q 6 BYTES TO BE PRINTED JSK BUFDUMP COPY CHLPTR,X RECOVER CHAN# IN X REG. COPY 0(X),X COPY =ACTMSG,A PRINT ACTUAL OPT. TABLE JSK MSG COPY =OPTBMSG,A JSK MSG COPY =OPTRCVP,Y COPY 0(Y,X),X GET ACTUAL OPT. TABLE ADDRESS COPY =3,Q PRINT 6 BYTES JSK BUFDUMP COPY CHLPTR,X COPY 0(X),X RECOVER CHAN# IN X REG. ERRCK77 JMP NOERR LPOOL ERRCHK8 COPY BUFERR,A BUFFER ERROR?  JEQ A,ERRCK77 COPY =EXPMSG,A JSK MSG COPY =DATMSG,A JSK MSG COPY =XBUFPTR,Y COPY 0(Y,X),X GET EXPECTED DATA BUFFER ADDRESS COPY BYTCNT,Q GET NO. BYTES TO PRINT SHIFT Q,R,1 JSK BUFDUMP PRINT EXPECTED DATA COPY CHLPTR,X COPY 0(X),X RECOVER CHAN#  IN X REG. COPY =ACTMSG,A JSK MSG COPY =DATMSG,A JSK MSG COPY =RBUFPTR,A COPY 0(Y,X),X GET ACTUAL DATA BUFFER ADDRESS COPY BYTCNT,Q GET NO. OF BYTES TO PRINT SHIFT Q,R,1 JSK BUFDUMP PRINT ACTUAL DATA COPY CHLPTR,X COPY 0(X),X RECOVER CHAN# IN X REG. JMP NOERR ERRCHK9 COPY BUFERR,A BUFFER ERROR? JEQ A,$-2 COPY =EXPMSG,A JSK MSG COPY =DATMSG,A JSK MSG COPY =EOLBUF,X COPY BYTCNT,Q GET BYTE COUNTS ADD =1,Q SHIFT Q,R,1 JSK BUFDUMP PRINT ACTUAL EOL BUFFER COPY CHLPTR,X COPY 0(X),X RECOVER CHAN# IN X REG. COPY =ACTMSG,A PRINT ACTUAL DATA JSK MSG COPY =DATMSG,A JSK MSG COPY =RBUFPTR,Y COPY 0(Y,X),X GET ACTUAL EOL DATA BUFFER POINTER COPY BYTCNT,Q GET BYTE COUNT ADD =1,Q SHIFT Q,R,1 JSK BUFDUMP PRINT ACTUAL EOL BUFFER NOERR JSK NEWLIN IMS CHLPTR INC. CHAN# LIST POINTER NOP COPY CHLPTR,X JMP ERRKLP CHECK ERROR OF NEXT CHANNEL ERRCHK10 POP RSK LPOOL * * SUBROUTINE TO WRITE OPT. TABLE & CHECK ERROR * WOPTAB EQU $ PUSH SSTAT COPY =OPTXMTP,A COPY A,BUFPTR0 SET XMT BUFFER POINTER COPY =4,A COPY A,BYTCNT SET 4 BYTE COUNTS COPY =TSTLST4,Q COPY Q,TSTLPT SET TEST LIST POINTER JSK PAIOB SET UP AUTO I/O BLOCKS WOPTAB1 JSK SZETIME SET TIME-OUT INTERVAL JSK HALFTIM REDUCE INTERVAL BY HALF COPY =:03,A SET ERROR TYPE COPY A,ERRLST COPY =WROPT,Q COPY Q,CMDWD1 SET WRITE OPT. COMMAND COPY =ERRLST,Y COPY =:05,A COPY A,1(Y) SET ERROR CODES COPY =NORXMT,A SET EXPECTED XMT STATUS COPY A,XMTMSK JSK DOIT SEND COMMANDS AND CHECK FOR ERRORS POP RSK * * SUBROUTINE TO READ & VERIFY OPTION TABLE * ROPTAB EQU $ PUSH SSTAT COPY =CHNLST1,X COPY X,CHLPTR2 ROPT2 COPY 0(X),X GET CHAN# JLT X,ROPTAB5 COPY X,CHNLST SET ONE CHANNEL AT A TIME COPY =-1,A COPY A,CHNLST+1 COPY =TSTLST3,A COPY A,TSTLPT SET TEST LIST POINTER COPY =OPTRCVP,A COPY A,BUFPTR1 SET RCV BUFFER POINTER COPY =7,A COPY A,BYTCNT SET BYTE COUNT COPY =64,A JSK CLRBUF CLEAR BUFFER COPY TSTPTR,Y COPY 0(Y),A GET TEST NO. CLSN A,=1 IT IS TEST 1? JMP ROPTAB2 COPY =64,A COPY A,MODE SET SECONDARY VECTOR OFFSET JSK PAIOB SET AUTO I/O BLOCKS JMP ROPTAB1 ROPTAB2 COPY =0,A COPY A,MODE SET PRIMARY VECTOR JSK PAIOB ROPTAB1 JSK SZETIME SZET UP TIME-OUT INTERVAL JSK HALFTIM COPY =:03,A COPY A,ERRLST SET ERROR TYPE COPY =RDOPT,Q COPY Q,CMDWD2 COPY =ERRLST,Y COPY =:06,A COPY A,2(Y) SET ERROR CODE COPY =NORRCV,A SET RCV STATUS COPY A,RCVMSK JSK CLRSTA CLEAR STATUS TABLES JSK CLXSTA SBIT 8,S SBIT 5,S JSK OUTOP SEND COMMANDS JSK EXAMSTA WAIT FOR EOB INTERRUPTS RBIT 5,S DSIABLE RTC CLOCK COPY CHNLST,X GET CHAN# COPY =OPTRCVP,Y COPY 0(Y,X),Y GET RCV OPT. TABLE ADDRESS SBIT 2,S SET BYTE MODE COPYB 4(Y),A SET STATUS BYTE COPYB A,7(Y) PUT IT IN 8TH BYTE COPYB 6(Y),A COPYB A,4(Y) RBIT 2,S JSK ERRCHK CHECK FOR ERRORS IMS CHLPTR2 INC. CHANL. LIST POINTER NOP COPY CHLPTR2,X JMP ROPT2 REPEAT FOR NEXT CHANNEL ROPTAB5 JSK RCHANL POP RSK LPOOL * * SUBROUTINE TO WRITE MODEM REGISTER * ON ENTRY: 'MDMREG'=DATA TO BE WRITTEN * WMOREG EQU $ PUSH SSTAT JSK SZETIME SET UP TIME OUT INTERVAL JSK HALFTIM COPY =TSTLST4,A COPY A,TSTLPT SET TEST LIST POINTER COPY =WRMOD,Q OR MDMREG,Q COMBINE WRITE MOD. REG. CMD. WITH DATA COPY Q,CMDWD1 COPY =ERRLST,Y COPY =2,A COPY A,0(Y) SET ERROR TYPE COPY =:03,A COPY A,1(Y) SET ERROR  CODES COPY =NORXMT,A COPY A,XMTMSK GET EXPECTED XMT STATUS JSK DOIT DO THE TEST POP RSK * * SUBROUTINE TO READ MODEM REGISTERS * ON ENTRY: 'RCVMSK'=EXPECTED STATUS * RMOREG EQU $ PUSH SSTAT COPY =TSTLST3,A COPY A,TSTLPT SET UP TEST LIST POINTER COPY =RDMOD,Q GET READ MOD. REG. COMMAND COPY Q,CMDWD2 COPY =ERRLST,Y COPY =2,A SET ERROR TYPE COPY A,0(Y) COPY =:04,A COPY A,2(Y) JSK SZETIME JSK DOIT POP RSK * * INPUT A BYTE FROM THE KEYBOARD * UPON REURN: (A)=CHARACTER BYTE IN ASCII * DTTYDA EQU :7C IKB EQU $ PUSH SSTAT RBIT 8,S COPY =:9618,A START ECHO, NO INTERRUPTS OUT A,DTTYDA%1;1 COPY =:100,X IKB10 EQU $ IN DTTYDA%1;1,A SHIFT A,RO,4 JF OV,IKB10 IN DTTYDA%1,A OUT X,DTTYDA%1;1 COPY K,X AND =:7F,A COPY A,AREG(X) SBIT 8,S ENABLE INTERRUPT POP RSK * * OUTPUT A CHARACTER TO CRT , (A)=CHARACTER * OTT EQU $ PUSH SSTAT RBIT 8,S JF SS,OTT90 OMIT ALL OUPUT IF SENSE SW. IS NOT SET COPY PNTFLG,X JNE X,OTT90 COPY =:8612,X OUT X,DTTYDA%1;1 OUT A,DTTYDA%1 COPY =:100,X OTT10 EQU $ IN DTTYDA%1;1,A SHIFT A,RO,5 JT OV,OTT10 OTT20 EQU $ IN DTTYDA%1;1,A SHIFT A,RO,5 JF OV,OTT20 OUT X,DTTYDA%1;1 OTT90 EQU $ SBIT 8,S ENABLE INTERRUPT POP RSK LPOOL * * INPUT DECIMAL NUMBER, CONVERT IT TO BINARY * AND PUT IT IN A REG. THE 1ST NON-NUMERIC * CHARACTER TERMINATES THE INPUT AND IS RETURNED * IN Q REG. NUMBERS IN THE RANGE 0-32767 MAY BE TYPED. * DECIN EQU $ PUSH SSTAT COPY =0,Q ZERO THE TEMP. JSK IKB AND =:7F,A MASK OFF THE PARITY BIT CLSN A,=:0D IS 1ST BYTE A CR? JMP DECI30 JMP $+3 DECI10 EQU $ JSK IKB GET A BYTE AND =:7F,A MASK OFF PARITY BIT CSK A,='0' JMP DECI90 <'0',INVALID NUMERIC NOP >'0',POTENTIALLY VALID CSK A,='9' ='0',VALID JMP DECI20 ,'9',VALID NUMERIC JMP DECI90 >'9',INVALID NUMERIC DECI20 EQU $ AND =:F,A COPY Q,X SAVE A COPY OF TEMP. SHIFT Q,LO,3 TEMP*8 ADD X,Q TEMP*9 ADD X,Q TEMP*10 ADD A,Q TMEP*10+NUM JMP DECI10 DECI30 EQU $ COPY =0,A FLAGGED A CR DECI90 EQU $ COPY K,X COPY A,QREG(X) COPY Q,AREG(X) POP RSK * * OUPUT A MESSAGE WHOSE ADDRESS IS IN (A). MESSAGE IS * TERMINATED BY A BYTE OF ALL ONE BITS * MSG EQU $ PUSH SSTAT ADD A,A BYTE ADDRESS COPY A,X MSG10 EQU $ SBIT 2,S SET BYTE MODE COPYB 0(X),A RBIT 2,S CLSN =:FF,A TERMINAL BYTE? JMP MSG90 YES, END JSK OTT NO, OUTPUT IT ADD =1,X BUMP BYTE POINTER JMP MSG10 MSG90 EQU $ POP RSK * * OUTPUT A LF/CR * NEWLIN EQU $ PUSH SSTAT COPY =:D,A JSK OTT COPY =:A,A JSK OTT POP RSK * * CONVERT BINARY NUMBER IN (A) TO DECIMAL * AND OUTPUT IT ON THE CRT * DECOUT EQU $ PUSH SSTAT COPY =DECTAB,Y COPY A,Q DECO10 EQU $ COPY 0(Y),X JLT X,DECO90 COPY =-1,A DECO20 EQU $ ADD =1,A SUB X,Q JGE Q,DECO20 ADD X,Q ADD ='0',A JSK OTT ADD =1,Y JMP DECO10 DECO90 EQU $ POP RSK DECTAB EQU $ WORD 10000,1000,100,10,1,-1 * * CONVERT (A) TO HEX OUTPUT * HEXOUT EQU $ PUSH SSTAT COPY =4,X COUNT CHARS. TO OUTPUT COPY A,Q SAVE ARGMENT HEXO10 EQU $ SHIFT A,RO,12 GET UPPER NIBBLE SUB =10,A JGE A,HEXO20 ADD ='0'+10,A JMP HEXO30 HEXO20 EQU $ ADD ='A',A HEXO30 EQU $ JSK OTT COPY Q,A SHIFT A,LO,4 COPY A,Q SUB =1,X JNE X,HEXO10 POP RSK LPOOL * * DUMP AN AREA IN MEMORY IN HEX, Q=NO. OF WORDS TO BE DUMPED * (X)=FIRT WORD ADDRESS TO DUMP * BUFDUM P EQU $ PUSH SSTAT COPY =8,Y 8 WORDS PER LINE BUFD10 EQU $ COPY =' ',A PRINT A SPACE JSK OTT COPY 0(X),A JSK HEXOUT PRINT THAT WORD ADD =1,X INCREMENT ADDRESS SUB =1,Q DECREMENT WORD COUNT JEQ Q,BUFD90 DONE SUB =1,Y DECREMNT NUMBER COUNT JNE Y,BUFD10 SAME LINE JSK NEWLIN JMP BUFDUMP+2 BUFD90 EQU $ JSK NEWLIN POP RSK * * SUBROUTINE TO DO SEND COMMANDS AND CHECK ERRORS * DOIT EQU $ PUSH SSTAT JSK CLXSTA CLEAR STATUS JSK CLRSTA SBIT 8,S ENABLE CPU INTERRUPT SBIT 5,S JSK OUTOP SEND COMMANDS JSK EXAMSTA WAIT FOR EOB INTERRUPTS RBIT 5,S TRUN OFF RTC INTERRUPT JSK ERRCHK CHECK FOR ERRORS POP RSK * * SUBROUTINE TO WRITE STANDARD OPT. TABLE & MODEM REGISTER * STDOPT EQU $ PUSH SSTAT JSK SETOPT SET UP BUFFER JSK WOPTAB WRITE STD. OPT. TABLE COPY =:07,A COPY A,MDMREG JSK WMOREG WRITE DTR,RTS,AUX POP RSK LPOOL * * SUBROUTINE TO PUT CONTENT 0F 2ND CHANNEL NO. LIST * ONTO ORIGINAL CHANNEL NO. LIST * RCHANL EQU $ PUSH SSTAT COPY =CHNLST1,Y COPY =CHNLST,X RCHANL0 COPY 0(Y),A JLT A,RCHANL1 COPY A,0(X) ADD =1,Y ADD =1,X JMP RCHANL0 RCHANL1 COPY A,0(X) POP RSK * * SUBROUTINE TO CLEAR THE BUFFERS * CLRBUF EQU $ PUSH SSTAT COPY =CHNLST,X COPY X,CHLPTR1 CLRBUF0 COPY 0(X),X GET CHANNEL NO. JLT X,CLRBUF1 COPY BUFPTR1,Y GET BUFFER POINTER COPY 0(Y,X),Y GET BUFFER ADDRESS COPY =0,A COPY BYTCNT,Q GET NO. BYTES ADD =1,Q SHIFT Q,R,1 NEG Q COPY A,0(Y) ADD =1,Y INCREMENT BUFFER ADDRESS IJNE Q,$-2 IMS CHLPTR1 NOP COPY CHLPTR1,X JMP CLRBUF0 CLRBUF1 POP RSK * * SUBROUTINE TO RESET ASYNCMUX BORAD * RSTMUX EQU $ PUSH SSTAT COPY =0,A COPY ADBAS,Q GET DEVICE BASE ADDRESS SHIFT Q,L,4 ADD =4,Q COMBINE ADDRESS WITH FUNCTION CODE XNX Q SELP A,ADSEL POP RSK * * SUBROUTINE TO PRINT CURRENT OPERATING BAUD RATE * PBAUD EQU $ PUSH SSTAT COPY =BRMSG,A JSK MSG COPY BAUPTR,Y GET BAUD RATE CODE POINTER COPY 0(Y),A GET BAUD RATE CODE IN HEX COPY =BAUTAB0,Y GET BAUD RATE TABLE ADDRESS COPY =-16,Q PBAUD0 CSK A,1(Y) NOP JMP PBAUD1 BAUD RATE CODE DOESNOT MATCH TABLE COPY 0(Y),A GET DECIMAL EQUIVALENT BAUD RATE JSK DECOUT PRINT THIS OUT JMP PBAUD2 PBAUD1 ADD =2,Y INCREMENT ADDRESS POINTER IJNE Q,PBAUD0 LOOP UNTIL TABLE ENDS PBAUD2 JSK NEWLIN LINE FEED & CR POP RSK LPOOL PEOB 0 PEOB 1 PEOB 2 PEOB 3 LPOOL PEOB 4 PEOB 5 PEOB 6 PEOB 7 LPOOL SEOB 0 SEOB 1 SEOB 2 SEOB 3 LPOOL SEOB 4 SEOB 5 SEOB 6 SEOB 7 LPOOL * EQUATES AND BUFFER AREAS * SSTAT EQU :40 TSTCNT EQU 12 TOTAL NO. TESTS ADSEL EQU 0 AECO EQU 6 RCVXMT EQU 3 XMTO EQU 1 RCVO EQU 2 XREGMSK EQU :2F00 NORRCV EQU :0000 NORMAL RECEIVE STATUS NORXMT EQU :0000 NORMAL XMT STATUS RMRCV EQU :0040 RANGE CHECK RCV STATUS SPCRCV EQU :0060 SPECIAL CHARACTER RCV STATUS RREGMSK EQU :10E7 RECEIVER STATUS MASK INHTIM EQU :43 10 MS TIMER BYPASS PLEXMOD EQU :03 HALF DUPLEX MODE DUPLEX EQU :0100 RSTRCV EQU :8000 RESET RCV HALF CHANNEL RSTXMT EQU :2000 REESET XMT HALF CHANNEL WRMOD EQU :1000 WRITE MODEM REGISTER WROPT EQU :1020 WRITE OPTION TABLE WRBUF EQU :1040 WRITE BUFFER WRBRK EQU :1060 SEND BREAK WREOL EQU :1080 SEND EOL WRCNC EQU :10A0 SEND CONTROL CHARACTER WRSPC EQU :10C0 WRITE SPECIAL CHARACTER RDMOD EQU :4000 READ MODEM REGISTER RDOPT EQU :4100 READ OPT. TABLE RDBUF EQU :4800 READ BUFFER RCVRM EQU :4A00 RECEIVE MESSAGE, RM RCVCR  EQU :4B00 RCV MESSAGE CM,RM RCVAE EQU :4C00 RECEIVE MESSAGE AE RCVAC EQU :4D00 RECEIVE MESSAGE AE,CM RCVACR EQU :4F00 RECEIVE MESSAGE AE,CM,RM DSR EQU :1 DATA SET READY CTS EQU :2 CLEAR TO SEND CD EQU :4 CARRER DETECT RI EQU :8 RING INDICATOR DTR EQU :1 DATA TERMINAL READY RTS EQU :2 READY TO SEND AUX EQU :4 AUXILIARY BIT ANS EQU :8 AUTO ANSWER RXBSY EQU :0000 REVEIVER BUSY TXBSY EQU :0000 TRANSMIT BUSY DAFC EQU 1 FUNCTION CODE BUSY EQU :3000 BUSY MASK TSTAB WORD TEST0,TEST1,TEST2,TEST3,TEST4,TEST5,TEST6,TEST7 WORD TEST8,TEST9,TEST12,TEST10,TEST11 TSTLPT WORD 0 TSTLST WORD 0,1,2,3,4,5,6 LIST OF TEST NOS.TO BE TESTED WORD 7,8,9,:A,:B,-1,-1,-1,-1,-1 TSTPTR WORD TSTLST TEST LIST POINTER TESTNO WORD 0 TEST NO. NOW DOING ADBAS WORD :7 DEVICE ADDRESS CHANL WORD 4 8 OR 4 CHANNEL INDICATOR CHNLST WORD 0,1,2,3,-1 LIST OF CHANNEL NOS. TO BE TESTED RES 4,-1 CHNLST1 WORD 0,1,2,3,-1 2ND CHANNEL NO. LIST RES 4,-1 CHLPTR WORD CHNLST CHANNEL LIST POINTER CHLPTR1 WORD CHNLST 2ND CHANNEL LIST POINTER CHLPTR2 WORD 0 BAULST WORD :3C,:3A,:38,:37,:36,:35 LIST OF BAUD RATES TO TEST WORD :34,:33 RES 9,-1 BAUPTR WORD BAULST BAUD RATE LIST POINTER STAPTR WORD 0 STATUS LIST POINTER XMTSTAT RES 8,-1 XMT STATUS RCVSTAT RES 8,-1 RCV STATUS AIOINST WORD 0 AIB/AOB INSTRUCTION RCVBUF0 RES 18,0 CHAN#0 RCV BUFFER RCVBUF1 RES 18,0 CAHN#1 RCV BUFFER RCVBUF2 RES 18,0 CHAN#2 RCV BUFFER RCVBUF3 RES 18,0 CHAN#3 RCV BUFFER RCVBUF4 RES 18,0 CHAN#4 RCV BUFFER RCVBUF5 RES 18,0 CHAN#5 RCV BUFFER RCVBUF6 RES 18,0 CHAN#6 RCV BUFFER RCVBUF7 RES 18,0 CHAN#7 RCV BUFFER BYTCNT WORD 0 BYTE COUNT EOLBUF WORD :0D00 RES 15,0 WORD :0A00 BRKBUF WORD 0,1,2,4,8,16,-1 BRKPT WORD BRKBUF CTLCHR WORD :03,:0D,:02,-1 CONTROL CHARACTER TABLE CTLPT WORD CTLCHR CONTROL CHAR. TABLE POINTER SCRPTR WORD SPCTAB,SPCTAB+1,SPCTAB+2,SPCTAB+3 WORD SPCTAB+4,SPCTAB+5,SPCTAB+6,SPCTAB+7 MDMREG WORD 0 MODEM REGISTER DATA SPCTAB BYTE :3A,:0D,:3B,:0D,:3C,:0D,:3D,:0D,:3E,:0D,:3F,:0D BYTE :2A,:0D,:2B,:0D SPECIAL CHARACTER TABLE XMTMSK WORD 0 XMT STATUS RCVMSK WORD 0 RECEIVER STATUS OPTXMTP WORD OPTXMT0,OPTXMT1,OPTXMT2,OPTXMT3,OPTXMT4 WORD OPTXMT5,OPTXMT6,OPTXMT7 OPTRCVP WORD OPTRCV0,OPTRCV1,OPTRCV2,OPTRCV3,OPTRCV4 WORD OPTRCV5,OPTRCV6,OPTRCV7 BUFPTR WORD 0 BUFPTR0 WORD 0 BUFPTR1 WORD 0 OPTDEF BYTE :63,:DD,:39,:37 DEFAULT OPTION TABLE XBUFPTR WORD XMTBUF,XMTBUF,XMTBUF,XMTBUF,XMTBUF WORD XMTBUF,XMTBUF,XMTBUF RBUFPTR WORD RCVBUF0,RCVBUF1,RCVBUF2,RCVBUF3 WORD RCVBUF4,RCVBUF5,RCVBUF6,RCVBUF7 XMTBUF BYTE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' XMBFPT RES 8,0 RMBFPT RES 8,0 OPTRCV0 RES 4,0 OPTRCV1 RES 4,0 OPTRCV2 RES 4,0 OPTRCV3 RES 4,0 OPTRCV4 RES 4,0 OPTRCV5 RES 4,0 OPTRCV6 RES 4,0 OPTRCV7 RES 4,0 OPTXMT0 RES 4,0 OPTXMT1 RES 4,0 OPTXMT2 RES 4,0 OPTXMT3 RES 4,0 OPTXMT4 RES 4,0 OPTXMT5 RES 4,0 OPTXMT6 RES 4,0 OPTXMT7 RES 4,0 BAUTAB0 WORD 50,:30,75,:31,110,:32,135,:33,150,:34,300,:35 WORD 600,:36,1200,:37,1800,:38,2000,:39,2400,:3A,3600,:3B WORD 4800,:3C,7200,:3D,9600,:3E,19200,:3F BAUTTL WORD -16 DBAUD WORD :3C,:3A,:38,:37,:36,:35,:34,:33,-1 EOBADR WORD EOB0,EOB1,EOB2,EOB3,EOB4,EOB5,EOB6,EOB7 WORD EOBS0,EOBS1,EOBS2,EOBS3,EOBS4,EOBS5,EOBS6,EOBS7 * * ERROR MESSAGES * FAILMSG BYTE 'FAILED' WORD -1 ERR0 BYTE ' PARTIAL RESET XMT HALF CHANL ' WORD -1 ERR1 BYTE ' PARTIAL RESET RCV HALF CHANL ' WORD -1 ERR2 BYTE '** NO EOB INTERRUPT ' WORD -1 ERR3  BYTE ' WRTIE MODEM REG. ' WORD -1 ERR4 BYTE ' READ MODEM REG. ' WORD -1 ERR5 BYTE ' WRITE OPT. TABLE ' WORD -1 ERR6 BYTE ' READ OPT. TABLE ' WORD -1 ERR7 BYTE ' WRITE SPECIAL CHARACTER ' WORD -1 ERR8 BYTE ' RECEIVE CHARACTER MACTH ' WORD -1 ERR9 BYTE ' SEND CONTROL CHARACTER ' WORD -1 ERR10 BYTE ' RECEIVE RANGE MATCH ' WORD -1 ERR11 BYTE ' SEND NEWLIN ' WORD -1 ERR12 BYTE ' SEND BREAK ' WORD -1 ERR13 BYTE ' FULL DUPLEX XMT BUFFER ' WORD -1 ERR14 BYTE ' FULL DUPLEX RCV BUFFER ' WORD -1 ERR15 BYTE ' HALF DUPLEX XMT BUFFER ' WORD -1 ERR16 BYTE ' HALF DUPLEX RCV BUFFER ' WORD -1 ERR17 BYTE ' FIRMWARE AUTO ECHO TRANSMIT ' WORD -1 ERR18 BYTE ' LOCAL LOOPBACK TRANSMIT ' WORD -1 ERR19 BYTE ' HARDWARE AUTO ECHO TRANSMIT ' WORD -1 ERR20 BYTE ' FIRMWARE AUTO ECHO RECEIVE ' WORD -1 ERR21 BYTE ' LOCAL LOOPBACK RECEIVE ' WORD -1 ERR22 BYTE ' HARDWARE ECHO RECEIVE ' WORD -1 ERRLST RES 3,0 ERRCODE WORD 0 ERRTAB WORD ERR0,ERR1,ERR2,ERR3,ERR4,ERR5,ERR6,ERR7 WORD ERR8,ERR9,ERR10,ERR11,ERR12,ERR13,ERR14,ERR15,ERR16 WORD ERR17,ERR18,ERR19,ERR20,ERR21,ERR22 TITLE BYTE 'ASYNC MUX DIAGNOSTIC, REV D1',:FF,:FF QUERY BYTE 'TEST CHOICES: ',:0D,:0A BYTE ' D - DEFAULT',:0D,:0A BYTE ' T - TECHNICIAN',:0D,:0A BYTE ' R - REPEAT LAST ',:0D,:0A BYTE ' G - GOTO DEBUG',:0D,:0A BYTE 'ENTER CHOICE ? ',:FF,:FF TCHQRY BYTE 'TECH TEST : ',:0D,:0A BYTE ' ENTER TEST NOS. (0-C) ? ',:FF,:FF CHLMSG BYTE ' ENTER CHANNEL NOS. (0-7) ? ',:FF,:FF BAUQRY BYTE ' ENTER BAUD RATE ? ',:FF,:FF DVAMSG BYTE ' ENTER DEVICE ADDRESS IN HEX (DEF=:7) ? :',:FF,:FF INTMSG BYTE ' ENTER INTERRUPT ADDRESS IN HEX (DEF=:2000) ? :',:FF,:FF CHLNO BYTE ' ENTER NO. OF CHANNELS (4 OR 8, DEF=4)? ',:FF,:FF HLTMSG BYTE ' HALT ON ERROR (Y OR N)? ',:FF,:FF PASSMSG BYTE 'PASS NO. ',:FF,:FF TSTMSG BYTE 'TEST NO. ',:FF,:FF TLERR0 BYTE 'TOTAL ERRORS, THIS PASS ',:FF,:FF TLERR1 BYTE 'TOTAL ERRORS, ALL PASSES ',:FF,:FF CNLMSG BYTE 'CHANNEL NO. ',:FF,:FF BRMSG BYTE 'BAUD RATE ',:FF,:FF ERRNUM BYTE '** ERROR # ',:FF,:FF XMTS BYTE 'ACTUAL XMT STATUS :',:FF,:FF RCVS BYTE 'ACTUAL RCV STATUS :',:FF,:FF XMTSE BYTE 'EXPECTED XMT STATUS :',:FF,:FF RCVSE BYTE 'EXPECTED RCV STATUS :',:FF,:FF EXPMSG BYTE 'EXPECTED ',:FF,:FF ACTMSG BYTE 'ACTUAL ',:FF,:FF MRGMSG BYTE 'MODEM REG. :',:FF,:FF OPTBMSG BYTE 'OPT. TABLE ',:FF,:FF BADBAU BYTE '** INVALID BAUD RATE',:FF,:FF MTPMSG BYTE '** MEMORY EXCEPTION TRAP',:FF,:FF DATMSG BYTE 'DATA ',:FF,:FF TSTLST0 WORD RCVO,RCVXMT,RCVO,RCVXMT,RCVO,RCVXMT,RCVO,RCVXMT TSTLST1 WORD RCVO,XMTO,RCVO,XMTO,RCVO,XMTO,RCVO,XMTO TSTLST2 WORD RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT TSTLST3 WORD RCVO,RCVO,RCVO,RCVO,RCVO,RCVO,RCVO,RCVO TSTLST4 WORD XMTO,XMTO,XMTO,XMTO,XMTO,XMTO,XMTO,XMTO TSTLST5 WORD XMTO,RCVO,XMTO,RCVO,XMTO,RCVO,XMTO,RCVO TSTLST6 WORD RCVXMT,RCVO,RCVXMT,RCVO,RCVXMT,RCVO,RCVXMT,RCVO TSTLST7 WORD AECO,RCVXMT,AECO,RCVXMT,AECO,RCVXMT,AECO,RCVXMT TSTLST8 WORD RCVXMT,AECO,RCVXMT,AECO,RCVXMT,AECO,RCVXMT,AECO STACKE EQU $ RES 150,0 STACK EQU $ PROGEND WORD :2000 END RCVO,XMTO,RCVO,XMTO,RCVO,XMTO,RCVO,XMTO TSTLST2 WORD RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT,RCVXMT TSTLST3 WORD RCVO,RCVO,RCVO,RCVO,RCVO,RCVO,RCVO,RCVO TSTLST4 WORD XMTO,XMTO,XMTO,XMTO,XMTO,XMTO,XMTO,XMTO TSTLST5 WORD XMTO,RCVO,XMTO,RCVO,XMTO,RCVO,XMTO,RCVO TSTLST6 WORD RCVXMT,RCVO,RCVXMT,RCVO,RCVXMT,R JG:0 O0SEGMENTBLANK oKDEBUG4 iitt  EpP I)  ǔ     W K JC E 7g EpP   QBy Iq @( q N0@+3q i @@žbÙƑK`@@  4 8u  E 7( W  2K ۞ m Vfef  Y YYXY  D G T RqJ E ?> i `a< w 0 9 O@X@QB ,q+  ,bksX" ,]e AZ CfVd C at  qj@Ahp  ,qt+KSF q l+âQ` L w+@ ϸ@+߮w `klZ &  @  ( E 7  K +  oG Mu d f @Ąk+zH  @  +kKS2 J U ?3% @  A >B C ;D E'k i      ɟ 3@ Nx @X ߬p± ƕ  @  @ A  y r/ o  n W  L뀀Acab݂݇ `d @ A B X @ S YJ @FˇO@ AKNNĞX<= ;3:; @ A  B 5 + @"I!)J '**A   @ A@ ߐh  H J ` mmm ՂՇ @ $ d тb @ A  BZɟφ ĢħĠ3I ߾w :::9 $3 @ A B  ޅ L @ r o y  L W 7ettt 3I pnlwl kk هقهRTTևX $Rӂ QQ @ A B G @ @AFFF3Æ22A AA3+ Iw 97 5s5 44 ! $ @ A  B   @  ߋH H  y?xx mmm ۂۇf ڇ $a @׃b @ A BT͇R Y ŀţ @ߧ3Â߸  Wc #   ËN0K C  G @L r  o O G{ 7H M EI Z0 .' .c # C @i `a +tهA c # C @`a +t c # C @ ž 'Ą@+kz@c # C @ p qH@ Ă IIăc # IwC @ pi 0 9 A F ic  # L M C @ %'c # C @l栀3 B枋D  BD B͞f c # C @0.' pc #  C @¿⿢@3m  `H`H߰sc # C @³ ǰ²ǭ±Ǥ 6_# 3❀☀ߒ r @ A B  c #    / C @h3d怀@ ABက)%'VT kc # C @HO)+T c # C @HE)+Tc  # C @ 7m3 + C @ U L   pc #  s ; /, C @IG `BÑ G@A   B pc # Jv rC  @Px3㙀Gn mm N㎀Gcb bC_]d e E  c # C @ I ØQMSI1+w  @ G@Iǂc #   xC @x@IN@Itc  # C @ܧ"3CF r9F h fc # C @     pc # 8y 3⧀Is⣀á m❀ÜhC @Q H*% h`'QC U2s A r sC  @qpנ3An ׂր@`@ @A  O@ A A ⪀@` @@ߐ A  7 EH K L M  e  Hpj@ii gfA ӀKZ XUՀRĀK KIFʀC    ܞ㫀 킪1/-* (⬀%݃= ◠I⏠ I  GA w  d    o'kⳠî NgaãN \V=RÖ KNNH①Ê KNB߉c # r 7  s E5C @.  q"   A c # C @ǧǠ3 Ă Q㿀@  @  ²ǥ B U W%DGFD' ߓIc # / ' o  A V / C @``]\_ @ A Vc # C @R ³QO @ BDGc #  C @96" p c # C @ͣ1ˢ "I6=I6"c  #  @C @ IN I 0 9  @N!@"@"@q p Ăc # C @ %'  <+xc # C @ 4 2c  # C @@@3 @#S=@" 0#kuc # 'd  C @)@ B : A@ 1@*1c # ^C @i   f+JQDjqAt?c #  C @UWc #  C @ c # V / W C @⽢@ k+zc # C @ 3 íKN@A@kTߤ pc # C @ ÞN0KC  c # C @㖀@HA @kTc #  r  7 + M EC @ )㰀  ⫟⫟C  @)㣀  ➟➟ C @)㖀  ⑟ C @)  ℟ ℟  C @)  sssqC @)؀  fffdC @)  YYYWC @) ⾀  LLLJC @ )EEC @)@@C @); ;C @)66C @)11C  @),,C @)''C @) ""fi9c N   <:876543       :  ; < = > ? * +       # '  c97    * < N `0123 456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 20K1n234,5 X6789 `:; < =%>K?<:8 76543  * 7 D Q ^ c h m r w | FAIL ED PARTIAL RESET XMT H ALF CHANL PARTIAL RES ET RCV HALF CHANL ** N O EOB INTERRUPT WRTIE MODEM REG. READ MODE M REG. WRITE OPT. TA BLE READ OPT. TABLE  WRITE SPECIAL CHARACT ER RECEIVE CHARACTER MACTH SEND CONTROL  CHARACTER RECEI VE RAN GE MATCH SEND NEWLIN SEND BREAK FULL  DUPLEX XMT BUFFER FUL L DUPLEX RCV BUFFER H ALF DUPLEX XMT BUFFER  HALF DUPLEX RCV BUFFER  FIRMWARE AUTO ECHO TR ANSMIT LOCAL LOOPBAC K TRANSMIT HARDWARE  AUTO ECHO TRANSMIT F IRMWARE AUTO ECHO RECEIV E LOCAL LOOPBACK RECE IVE HARDWARE ECHO RECEIVE  i y    '4DRbq~ ASYNC MUX DIAGNOSTIC, RE V D1TEST CHOICES:  D - DEFAULT T - TEC HNICIAN R - REPEAT L AST G - GOTO DEBUG  ENTER CHOICE ? TECH TEST : ENTER TEST N OS. (0-C) ? ENTER CH ANNEL NOS. (0-7) ?  ENTER BAUD RATE ? EN TER DEVICE ADDRESS IN HE X (DEF=:7) ? : ENTER  INTERRUPT ADDRESS IN HEX (DEF=:2000) ? : ENTE R NO. OF CHANNELS (4 OR  8, DEF=4)? HALT ON  ERROR (Y OR N)? PASS N O. TEST NO. TOTAL  ERRORS, THIS PASS TO TAL ERRORS, ALL PASSES  CHANNEL NO. BAUD RAT E ** ERROR # ACTU AL XMT STATUS : ACTUAL RCV STATUS : EXPECTED XMT STATUS : EXPECTED RCV STATUS : EXPECTED ACTUAL MODEM REG. :OPT. TABLE ** INV ALID BAUD RATE** MEMOR Y EXCEPTION TRAPDATA         TOTAL  ERRORS, THIS PASS TO TAL ERRORS, ALL PASSES  CHANNEL NO. BAUD RAT E ** ERROR # ACTU IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII?e820223073138820223073138820223073555e@820223073138820223073138820223073554" e820223073138820223073138820223073138e820223073138820223073138820223073138820223073138820223073138820223073138eq8008191545117580081915454350800819154543deu8008191546037580081915461275800819154612de*8008191546342580081915464450800819154644d e4# G8008121433352580081214333850800812143338d$ % & ' ( ) * + . ASYNCMUX ASMASYNCMUX OBJASYNCMUX BIN ASYNCMUX JCL, OVicEdDanoK .EpP I) ǔ    W KJC E 7 EpP QByIq @(q N0@+3q i@@žbÙƑK`@@ 4 8u E 7( W 2K ۞m Vfef Y YYXY D G T RqJ E ?>i `a< w 0 9O@X@QB ,q+ ,bksX" ,]e AZ CfVd C a qj@Ahp ,qt+KSF ql+âÂQ`L w+@ϸ@+߮w`klZ& @ ( E 7  K + oG Mu d f@Ąk+zH @ +kKS2 J U?3% @ ɄA >B C ;D E'ki      3@Nx @X ߬p±ƕ  @ @ A y r/ o  n W L뀀Acab݂݇݇`d @ A B X @S YJ @FˇO@AKNNĞX<=;3:; @ A B 5 + @"I!)J'**A  @ A@ߐh H J `mmm ՂՇ @ $d тb @ A BZɟφĢħĠ3I ߾w :::9 $3 @ A B ޅL @ r o y L W 7ettt3I pnlwl kkهقهRTTևX $RӂׇQQ @ A B G @ @AFFF3Æ22AAA3+ Iw 975s5 44! $ @ A B   @ ߋH H y?xxmmm ۂۇۂfڂ $a @׃b @ A BT͇RY ŀţ@ߧ3Â߸ Wc #   ËN0KC  G @L r o O G{ 7H M EI Z0.' .c # C @i `a +tهAc # C @`a +tc # C @ ž'Ą@+kz@c # C @ p qH@ ĂIIăc # IwC @ pi 0 9 A F ic # L M C @ %'c # C @l栀3BD BD B͞fc # C @0.' pc # C @¿⿢@3m `H`H߰sc # C @³ǰ²ǭ±Ǥ 6_#3❀☀ߒr @ A B c #   /C @h3d怀@ABက)%'VTkc # C @HO)+Tc # C @HE)+Tc # C @ 7m3+C @ UL  pc # s ; /,C @IG `BÑG@A  B pc # Jv rC @Px3㙀Gnmm N㎀GcbbC_]d e E c # C @ IØQMSI1+w  @ G@Iǂc #  xC @x@IN@Itc # C @ܧ"3CFr9Fh  fc # C @    pc # 8y3⧀Is⣀ám❀ÜhC @Q H*%h`'QC U- 2s A r sC @qpנ3An ׂր@`@@A O@A A ⪀@`@@ߐA  7 EHK L M  e Hpj@iigfA ӀKZXUՀRĀKKIFʀC    ܞ㫀킪1/-*(⬀%݃=◠I⏠I  GA w  d   o'kⳠîNgaãN\V=RÖKNNH①ÊKNB߉c # r 7 s E5C @. q"  A c # C @ǧǠ3Ă Q㿀@  @ ²ǥ B UW%DGFD'ߓIc # / ' o A V / C @``]\_ @ A Vc # C @R³QO @ BDGc # C @96" pc # C @ͣ1ˢ"I6=I6"c #  @C @IN I 0 9 @N!@"@"@q pĂc # C @ %' <+xc # C @ 4 2c # C @@@3 @#S=@" 0#kuc # 'd C @)@ B : A@1@*1c # ^C @i f+JQDjqAt?c # C @UWc # C @ c # V/ W C @⽢@Ąk+zc # C @3 íKN@A@kTߤpc # C @ ÞN0KC c # C @㖀@HA@kTc # r  7 + M EC @)㰀  ⫟⫟C @)㣀  ➟➟C @)㖀  ⑟⑟C @)  ℟℟  C @)  sssqC @)؀  fffdC @)ˀ  YYYWC @)⾀  LLLJC @)EEC @)@@C @);;C @)66C @)11C @),,C @)''C @)""fi9cN   <:876543   X    : ; < = > ? * +      # '  c97   * < N `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZP`20K1n234,5X6789 `:;< =%>K?<:876543  * 7 D Q ^ c h m r w | FAILED PARTIAL RESET XMT HALF CHANL PARTIAL RESET RCV HALF CHANL ** NO EOB INTERRUPT WRTIE MODEM REG. READ MODEM REG. WRITE OPT. TABLE READ OPT. TABLE WRITE SPECIAL CHARACTER RECEIVE CHARACTER MACTH SEND CONTROL CHARACTER RECEIVE RANGE MATCH SEND NEWLIN SEND BREAK FULL DUPLEX XMT BUFFER FULL DUPLEX RCV BUFFER HALF DUPLEX XMT BUFFER HALF DUPLEX RCV BUFFER FIRMWARE AUTO ECHO TRANSMIT LOCAL LOOPBACK TRANSMIT HARDWARE AUTO ECHO TRANSMIT FIRMWARE AUTO ECHO RECEIVE LOCAL LOOPBACK RECEIVE HARDWARE ECHO RECEIVE  i y   '4DRbq~ASYNC MUX DIAGNOSTIC, REV D1TEST CHOICES: D - DEFAULT T - TECHNICIAN R - REPEAT LAST G - GOTO DEBUG ENTER CHOICE ? TECH TEST : ENTER TEST NOS. (0-C) ? ENTER CHANNEL NOS. (0-7) ? ENTER BAUD RATE ? ENTER DEVICE ADDRESS IN HEX (DEF=:7) ? : ENTER INTERRUPT ADDRESS IN HEX (DEF=:2000) ? : ENTER NO. OF CHANNELS (4 OR 8, DEF=4)? HALT ON ERROR (Y OR N)? PASS NO. TEST NO. TOTAL ERRORS, THIS PASS TOTAL ERRORS, ALL PASS. ES CHANNEL NO. BAUD RATE ** ERROR # ACTUAL XMT STATUS : ACTUAL RCV STATUS : EXPECTED XMT STATUS : EXPECTED RCV STATUS : EXPECTED ACTUAL MODEM REG. :OPT. TABLE ** INVALID BAUD RATE** MEMORY EXCEPTION TRAPDATA  ۾ ~͞"0SU 4~<o$jT<BR{|}S;TUTV T ( :ӂE - :ӂ" )  J ΦpP0 @0B ¢` h }cD ¯pP0/o D E B U G 4 E 4 0 0 ӟe 3} ӂzӾ P AC Q@ X= Y:ԽѾ K3 L0 S- D* C'ԟK =ӟ{ } ӟ|" *ٽ҆ Y Q A Gҽ؆ R Ƥ D V Wƚ›LBLCLFLLLSLJLILGLRLZߝ Ǟ< /}҆{҆u łt P Lłj T P BŁ P ӂ\ W H TŅ Ğ|QEI , , `솂՟ _ٞ3 9} ` J B YK QJf䞁ւ cޡ @ޟޝ `@E ;߽RA@EN@Aޏǎ Qފ ,^:F& o*| x` D `랞oY*Qd Ѐ_Ѐ āZ@AĄ܃T B `ǁ D임*L_U3 `Ģ1*/) 'r "Bƽу۽ֽˁC凑ā / XŃ ѽ۞i ]с䆫@ڃ۽ցBǢ ,ž[ + - * X /KJƎ^[{ xނZ ,ş| ֽL ΁ P ޽с۽۽޺{ ӽўq kɆȂGާ}ަyޠ}y E ~  .Ӄ E ~  .ޣރfN ,Žֆs@FC kqLL (w{u ^|JQBZy L S TўNM  Isľˆ_]]| IƎ> ,ŽƇ ,ƂpIưk , ,Htr Hm -ņց -ņ('\\ÂF -tтڃԞx ’@"Fz@ Ό F ō lG#䆠.bƝޙޖJQ!’ފދJQĽ %ӂԞu U B * ӂGo h fe "cIaM K Y&V&RR `QKL$kK N =ӂDD GӂA   :Ӟ ӟL ̟{ y9u    :w ³ 0C C 96C C " z a ࢅ0 `e •墒C "C tC I60@—Tz @0 6=". 1 `@p Iyyyx R G , ; + - * / X_1]\IW` RRR -@A@KJ@ JH +O -M * / X?Ҿ  `YҾ B `R-҆, , +& N I+KL v `p `PAQXYKLSDC Z A 9 0n C F =  t ,Ɲ ,ƙ˽•䆒ޏJQ ` Tѝ Žp@ ʽтۂTB۝ľ@L@|LOLmLo׾  `LpJRbC ߞݞ[ } ޟ} @ƹwr·Q†BLLreޣޤsg3 P@™b@ `@ ` @P `lނ}H/ .ry  qvty j 6 fdv s`z fZYya[ľ⟄ Cӝ IOH0zr(E ` <;C TK@ԝĽ MӃ/ԝ 6I6;6D6666""d "96=96"q "I6=I6"qp 0|| y0 `{ 6} ` L o , ,Ūߦ `AņЁ V IP΃͆˃ʅ QJ @ } }IPNÂAKK ՂF IƱ ² ¨N ‚çަ| } Kz h# hƿcQHUbQÎaA¶snQBzx } @ydK@_Fs? V;8HgKeI 3Q IIZ@ZI A=; 7 6 31w BK . IJQs %ӂ" xmE7E4E5E3--E2E0|| y0 `{ 6} ` L o , ,Ūߦ `AņЁ V IP΃͆˃ʅ QJ @ } }IPNÂAKK ՂF IƱ ² ¨N ‚çަ| } Kz h# hƿcQHUbQÎaA¶snQBzx } @ydK@_Fs? V;8HgKeI 3Q IIZ@ZI A=; 7 6 31w BK . IJQs %ӂ" A LO=LP MACRO ASYNCMUX.ASM LINK ASYNCMUX=ASYNCMUX(ABS=1100)+DM0.DEBUGS 820223073138820223073138820223073138IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 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