IMD 1.17: 14/03/2012 8:40:51 SCSI B3466A 3.5" DS      €SCSI  M“'XHWIA_UTILTéK “B$€ÛHWI_UTILSTéKf“B)€e§MACHINE2T_éK„“B1€±MACHINE3T_éK•“B3€—MACHINE4T_éK± “B5€þMACHINE5T_éKº “B6€ nOSD_HLT___éKÄ“BG€>OSD_LLT___éKËI“BQ€HûOSD_LLAT__éK “BS€¤PWS_SCSIT_éK“BT€¹SCSIIFT___éK!ú“C€ùMSCSI_ISRT_éK “C€ SCSI_UTILTéK$“C€STATE_DRVTéK'“C €OST_APT____éK/“C€‹ST_EPT____éK4 “C€ST_PROCST_éK="“C €!ïST_SDT____éK_“C#€©ST_TPT____éKn“C&€FscsidiskT_éKsP“C2€OŒCOMMANDST_éKÃB“C7€AƒMACHINE1T_éK“CA€ïMESSAGEST_éK$—“CI€–]SCSI_DEFSTéK»2“CT€1  nosyms mname HWIA_UTILS src MODULE HWIA_UTILS; src import SCSI_DEFS; src export src procedure hwiAXfer(var XferBlock:XferBlockType; PtrScsiChip:PtrScsiChipType); src END; def HWIA_UTILS_HWIAXFER def HWIA_UTILS_HWIA_UST_EQUT___éKí“CW€¶ST_XFERT__éKñ“D€ WMATCHSTRT_éKÿ/“U)€.YMAKE_SCSITéK. “UG€rMAKERT____éK7@“ &€?*COMPILER ê2w²“ "€READMET___)p S€7READMET___éK+“  €nTILS def HWIA_UTILS__BASE regScsiChip equ a4 intsOffset equ 9 sstsOffset equ 13 dataOffset equ 21 BitFIFOEmpty equ 0 BitFIFOFull ÿÿ equ 1 regXferBlock equ a3 XferPhaseOffset equ 0 XferRetryCountOffset equ 2 XferSavedDataPointerOffset equ 4 XferSavedDataLengthOffset equ 8 XferDMACountOffset equ 12 XferBufPtrOffset equ 16 XferBufLenOffset equ 20 XferDoDMAOffset equ 24 regBufPtr equ a2 regChipData equ a1 regChipSst     y clr.w regBufLen ; dbra only works on 16 bits subq.l #1,regBufLen ; check for > 16 bit transfer bgt.s check_fifo_empty bra.s exit_restore fifo_empty equ * tst.b intsOffset(regScsiChip) beq.s check_f{ Hardware Interface Utilities Utilities that interface to the SCSI hardware are placed here. NOTE: Access to the hardware is not limited to this module. } module HWI_UTILS; import SCSI_DEFS, OSD_LL, SCSI_UTILS, HWIA_UTILS; export { Routines caifo_empty bra.s exit_restore outbound_xfer equ * ******************************************************************* * while (there is data in the buffer) * if fifo not full * output data * else fifo is full * lled by the state machine } Procedure hwiGetPhase(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure hwiInitHW(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure hwiHardReset(PtrSessionBlock:PtrSessionBlockTypes equ a0 regBufLen equ d2 HWIA_UTILS__BASE equ * HWIA_UTILS_HWIAXFER equ * ******************************************************************* * set up registers * predecrement regBu wait for an interrupt or fifo not full * on interrupt exit * wait for fifo to empty or an interrupt to occur ******************************************************************* check_fifo_full equ * btst #BitFIFOFull,(regChipSsts)fLen to compensate for dbra termination on -1. * if the register is < 0, then 0 or negative length, do nothing in * this case. ******************************************************************* move.l 8(sp),regXferBlock move.l 4(sp),regScsiChip le bne.s fifo_full move.b (regBufPtr)+,(regChipData) dbra regBufLen,check_fifo_full clr.w regBufLen ; dbra only works on 16 bits subq.l #1,regBufLen ; check for > 16 bit transfer bgt.s check_fifo_full wait_fifoa dataOffset(regScsiChip),regChipData lea sstsOffset(regScsiChip),regChipSsts move.l XferBufPtrOffset(regXferBlock),regBufPtr move.l XferBufLenOffset(regXferBlock),regBufLen subq.l #1,regBufLen blt.s exit_restore *******************_empty equ * btst #BitFIFOEmpty,(regChipSsts) bne.s exit_restore tst.b intsOffset(regScsiChip) beq.s wait_fifo_empty bra.s exit_restore fifo_full equ * tst.b intsOffset(regScsiChip) beq.s check_fifo_full * ************************************************ * determine if this is an inbound or outbound transfer ******************************************************************* cmpi.w #1,XferPhaseOffset(regXferBlock) bne.w outbound_xfer inbound_xfer  bra.s exit_restore exit_restore equ * ******************************************************************* * restore registers into the XferBlock. Add 1 to regBufLen * to get the true final count. This compensates for dbra * terminating onequ * ******************************************************************* * while (there is room in the buffer) * if fifo not empty * input data * else fifo is empty * wait for an interrupt or fifo not empty *  -1. ******************************************************************* move.l regBufPtr,XferBufPtrOffset(regXferBlock) addq.l #1,regBufLen move.l regBufLen,XferBufLenOffset(regXferBlock) ********************************************************* on interrupt exit ******************************************************************* check_fifo_empty equ * btst #BitFIFOEmpty,(regChipSsts) bne.s fifo_empty move.b (regChipData),(regBufPtr)+ dbra regBufLen,check_fifo_empt********** * restore stack and go back to caller ******************************************************************* move.l (sp)+,a0 addq.w #8,sp jmp (a0) HWIA_UTILS_HWIA_UTILS equ * rts END      ; Var ResultCode:S_SHORT); Procedure hwiGetMsgOut(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); { hardware interface utility routines } Procedure hwiSCInitHW(Sc:S_TYPE_ISC); Procedure hwiSCHardReset(Sc:S_TYPE_ISC); function hwiGe else if SessionState <> SessionRunning then ResultCode := ORD(BusBusy) {Another Session is running} else {this session must be in an information transfer phase} begin ResultCode := PhaseTranslate[BusLines.t_phase]; end; end; end; {*********tCardPtr(PtrSessionBlock:PtrSessionBlockType):PtrScsiCardType; function hwiGetChipPtr(PtrSessionBlock:PtrSessionBlockType):PtrScsiChipType; function hwiManXfer(pSB:PtrSessionBlockType; var b:s_byte; hwPhase:phase_code; MORE, ReplyRequest:Boolea**************************************************************** * hwiInitHW ************************************************************************* * * On Input: nothing expected * * * Functional Description: * * Initialize the hardware tn):Boolean; function hwiProgXfer(pSB:PtrSessionBlockType):Boolean; function hwiStartDMAXfer(pSB:PtrSessionBlockType):Boolean; function hwiEndDMAXfer(pSB:PtrSessionBlockType; var ResultCode:S_SHORT):Boolean; implement {******************************hat this session is attached to. * * On Output: Hardware is initialized, ResultCode is NoEvent. * *************************************************************************} Procedure hwiInitHW(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHOR******************************************* * hwiGetPhase ************************************************************************* * * On Input: nothing expected. * * * Functional Description: * * If the chip is not currently connected to tT); begin hwiSCInitHW(PtrSessionBlock^.SelectCode); ResultCode := ORD(NoEvent); end; {************************************************************************* * hwiHardReset ************************************************************************* he bus, then the * phase is either BusFree or BusBusy. * Otherwise, if this session is not running (chip is servicing another * session, then the phase is BusBusy. * Otherwise, the bus phase is that on the bus. * * * On Output: * * On Input: nothing expected * * * Functional Description: * * Toggle the Scsi Bus Reset Line for the bus that this session is * attached to. * * Reset all of the H/W registers for this select code. * * On Output: Reset Line isA phase event (see SCSI_DEFS) * * *************************************************************************} Procedure hwiGetPhase(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); type PhaseTranslateType = Array[phase_code] of S_SHORT; con toggled, ResultCode is NoEvent. * *************************************************************************} Procedure hwiHardReset(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin hwiSCHardReset(PtrSessionBlock^.SelectCode); Resultst PhaseTranslate = PhaseTranslateType[ord(DataPhase), ord(DataPhase), ord(CmdPhase), ord(StatusPhase), ord(BusFree), ord(ScsiErr), ord(MsgOut), ord(MsgIn)]; var BusLines:psns_type; begin with PtrSessionBlock^, InternalBlock.Code := ORD(NoEvent); end; {************************************************************************* * hwiGetMsgOut ************************************************************************* * * On Input: Path is active, but bus is not guaranteed pScBlock^.PtrScsiChip^ do begin BusLines.psns := psns.psns; if ssts.action = spc_not_connected then {chip is not being used} begin if BusLines.bsy or BusLines.sel then ResultCode := ORD(BusBusy) else ResultCode := ORD(BusFree); end to be in any * particular phase. A transfer may currently be active. * * Functional Description: * * Get the bus to a MsgOut phase. If a transfer is active, finish * it up first. * * On Output: MsgOut or ScsiErr. * * *     ctl.t_phase := psns.t_phase; if (psns.io) {input mode} then begin scmd.cmd := set_ack_req_cmd; repeat until (not psns.req) or (psns.t_phase = msg_out_phase); b := data_regs.temp; end else {output mode} begin datal Description: * * Initialize the hardware that is on the given select code. * * On Output: Hardware is initialized. * *************************************************************************} procedure hwiSCInitHW(Sc:S_TYPE_ISC); var pScBloa_regs.temp := #0; scmd.cmd := set_ack_req_cmd; repeat until (not psns.req) or (psns.t_phase = msg_out_phase); end; {raise atn prior to resetting ack} scmd.cmd := set_atn_cmd; osdDelay(1); scmd.cmd := reset_ack_req_cmd; ck:PtrSelectCodeBlockType; begin pScBlock := osdGetScBlock(Sc); with pScBlock^, PtrScsiChip^, PtrScsiCard^ do begin id_reg.reset := 0; { reset the card } sc_reg.ie := false; { disable card interupts } sctl.sctl := 0; sctl.sctl := reset_d************************************************************************} Procedure hwiGetMsgOut(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); label 1; var XferCount:integer; RunLevel:integer; b:char; sb:s_byte; begin with PtrSessionBl end else begin scmd.cmd := set_atn_cmd; osdDelay(100); {let nice devices react.} end; hwiGetPhase(PtrSessionBlock, ResultCode); if ResultCode in [ord(MsgOut), ord(BusFree), ord(BusBusy)] then goto 1; end; { continue to trock^,InternalBlock.pScBlock^,PtrScsiChip^ do begin RunLevel := osdGetRunLevel; osdSetRunLevel(7); {no interrupts during this code!} hwiGetPhase(PtrSessionBlock, ResultCode); if ResultCode in [ord(MsgOut), ord(BusFree), ord(BusBusy)] tansfer at the targets beck and call until we get a message out phase, bus free phase, or bus busy. } repeat data_regs.tch := chr(0); data_regs.tcm := chr(0); data_regs.tcl := chr(0); pctl.t_phase := psns.t_phase; scmd.cmd := set_atn_hen goto 1; if ssts.action = spc_init_xfer then {transfer currently in progress} begin scmd.cmd := set_atn_cmd; osdDelay(100); osdStartTimer(2*one_second); repeat if scmd.prgx then {programattic transfer going on, probably won't happen}cmd; scmd.scmd := transfer_prgx + 1; {transfer with 0 padding} osdStartTimer(2 * one_second); repeat until (psns.t_phase = msg_out_phase) or (ssts.action = spc_init_xfer) or (ints.ints <> 0) or (osdTimeExpired); if os begin if psns.io then {inbound} begin if not ssts.dempty then begin b := data_regs.dreg; end; end else {output} begin if not ssts.dfull then begin data_regs.dreg := chr(0); enddTimeExpired then {target is not talking} begin ints.ints := ints.ints; hwiGetPhase(PtrSessionBlock, ResultCode); goto 1; end; repeat until (psns.t_phase = msg_out_phase) or (ints.ints <> 0); ints.ints := ints.ints; osdD; end; end {else dma transfer going on, will happen!} until (ints.ints <> 0) or (osdTimeExpired); osdDelay(1); ints.ints := ints.ints; hwiGetPhase(PtrSessionBlock, ResultCode); if ResultCode in [ord(MsgOut), ord(BusFree), ord(Buelay(1); {let bus lines settle} hwiGetPhase(PtrSessionBlock, ResultCode); until ResultCode in [ord(MsgOut), ord(BusFree), ord(BusBusy)]; 1: if ResultCode <> ord(MsgOut) then scmd.cmd := reset_atn_cmd; sctl.cr := TRUE; sctl.cr := FALSE; sBusy)] then goto 1; end else begin { the chip may or may not have been reset prior to entering this routine, so optionally transfer a byte manually. } if (psns.req) then {chip may have missed req so manual transfer} begin p osdSetRunLevel(RunLevel); end; end; {************************************************************************* * hwiSCInitHW ************************************************************************* * * On Input: nothing expected * * * Function     isable + control_reset; { ensure SPC disabled } osdDelay(1); { do required initialization of SPC registers } bdid := chr(7-config_reg.dev_addr); { use ones compliment of dev_addr } scmd.scmd := 0; tmod.tmod := 0; pctl.pctl := 0; ointer to the Card that this session is attached to. * * On Output: * * *************************************************************************} function hwiGetCardPtr(PtrSessionBlock:PtrSessionBlockType):PtrScsiCardType; begin hwiGetCardPtr := Ptr data_regs.temp := #0; data_regs.tch := #0; data_regs.tcm := #0; data_regs.tcl := #0; psns.sdgc := 0; ints.ints := ints.ints; { clear all interupts } { set up the control register, note interupts are not enabled. } if confiSessionBlock^.InternalBlock.pScBlock^.PtrScsiCard; end; {************************************************************************* * hwiGetChipPtr ************************************************************************* * * On Input: Nothing Expectg_reg.parity then sctl.sctl := RESET_DISABLE + arbit_enable + reselect_enable + parity_enable + int_enable else sctl.sctl := RESET_DISABLE + arbit_enable + reselect_enable + int_enable; sctl.rd := false; { clear reseed * * * Functional Description: * * Retrieve a pointer to the Chip that this session is attached to. * * On Output: * * *************************************************************************} function hwiGetChipPtr(PtrSessionBlock:PtrSest disable } config_reg.pal_reset := 1; osdDelay(1); end; end; {************************************************************************* * hwiSCHardReset ************************************************************************* * * On Input:sionBlockType):PtrScsiChipType; begin hwiGetChipPtr := PtrSessionBlock^.InternalBlock.pScBlock^.PtrScsiChip; end; {************************************************************************* * hwiManXfer ************************************************* nothing expected * * * Functional Description: * * Toggle the Scsi Bus Reset Line for the bus that is attached to the * given select code. * * Reset all of the H/W registers for this select code. * * On Output: Reset Line is togg************************ * * On Input: The bus is in the desired phase and the target is requesting * data be transfered (direction of transfer will be based on * what is on the bus). * * Functional Description: * * Transfeled. * *************************************************************************} procedure hwiSCHardReset(Sc:S_TYPE_ISC); var pScBlock:PtrSelectCodeBlockType; i:integer; begin pScBlock := osdGetScBlock(Sc); with pScBlock^, PtrScsiCard^, PtrScsiChir one byte of data in or out of the SCSI bus that is attached * to the given session. The caller must supply the expected bus phase * and the caller must anticipate the direction of the transfer. * * If the caller anticipates that the Ap^ do begin sc_reg.ie := false; { disable card interupts } sctl.sctl := 0; scmd.scmd := rst_out; osdDelay(1); hwiSCInitHW(Sc); for i := 0 to 7 do DeviceSynchParms[i].SynchState := NoSynch; osdDelay(one_second); end; end; {TN line should be on during the transfer * (more bytes of message out data will follow), then the caller must * indicate so in the MORE boolean. (On the last byte of message out * data, the MORE parameter should be set to false). * * ************************************************************************* * hwiGetCardPtr ************************************************************************* * * On Input: Nothing Expected * * * Functional Description: * * Retrieve a p If the caller anticipates a need to reply to this data, then by * definition, the ATN line must be raised prior to the ACK line being * released. In this case, set the ReplyRequest boolean. * * On Output: TRUE if the transfer was succes     ts = 0) then {xfer went o.k.} begin hwiManXfer := true; if (hwPhase = msg_in_phase) and (ReplyRequest) then scmd.cmd := set_atn_cmd; end else hwiManXfer := false; scmd.cmd := reset_ack_req_cmd; ints.ints := cmd_complete; et up. } { tell chip to commence a programmatic transfer } ints.ints := ints.ints; scmd.scmd := transfer_prgx; { wait for chip to respond } if ssts.action <> spc_init_xfer then begin osdStartTimer(one_second); repeat until (nd; { if this is the end of the manual transfer, then wait for a phase change. } if (not MORE) and (ints.ints = 0) and (psns.t_phase = hwPhase) then begin osdStartTimer(one_second); repeat until (psns.t_phase <> hwPhase) or osdTimeEssts.action = spc_init_xfer) or (ints.ints <> 0) or osdTimeExpired; if (ints.ints <> 0) then goto 2; if ssts.action <> spc_init_xfer then begin utlSetInternalErr(pSB, ScsiXferErr); goto 1; end; end; { execute the programmasful, FALSE otherwise. * * tbd - need to check for parity error and retransmit *************************************************************************} function hwiManXfer(pSB:PtrSessionBlockType; var b:s_byte; hwPhase:phase_code; MORE, ReplyReqxpired; if (psns.t_phase = hwPhase) then begin hwiManXfer := false; utlSetInternalErr(pSB, ScsiPhaseErr); end; end; end; end; {************************************************************************* * hwiProgXfer ***************uest:Boolean):Boolean; var retry_count : integer; begin with pSB^.InternalBlock.pScBlock^.PtrScsiChip^ do begin ints.ints := ints.ints; { wait for target to request transfer. this ensures that the target has set the bus they way he wants it. ********************************************************** * * On Input: The bus is in the desired phase and the target is requesting * data be transfered (direction of transfer will be based on * what is on the bus). The XferBlock } if (not psns.req) and (hwPhase = psns.t_phase) then begin osdStartTimer(one_second); repeat until (psns.req) or (hwPhase <> psns.t_phase) or osdTimeExpired; end; if (MORE) and (hwPhase = msg_out_phase) then begin scmd.cmd := set_ in the InternalBlock has * been set up. * * Functional Description: * * Set up the hardware for a programmatic transfer and execute it. * Process all follow on interrupts. * * On Output: TRUE if the transfer was successful, FAatn_cmd; end else begin scmd.cmd := reset_atn_cmd; end; if (not psns.req) or (hwPhase <> psns.t_phase) then begin {peripheral isn't talking or requested phase is not equal to real bus phase} hwiManXfer := false; end else {target hLSE otherwise. * if FALSE, internal error type has been set. * *************************************************************************} function hwiProgXfer(pSB:PtrSessionBlockType):Boolean; label 1,2; Var SaveInts:ints_type; ResultCodas raised req, requesting xfer} begin pctl.t_phase := hwPhase; if psns.io then {input operation} begin { data is actually on the bus, but temp is not set until ack command is given } scmd.cmd := set_ack_req_cmd; repee:S_SHORT; begin hwiProgXfer := false; with pSB^.InternalBlock, XferBlock, pScBlock^, PtrScsiChip^, PtrScsiCard^ do begin { set up transfer count } data_regs.tch := chr(XferBufBlock.BufLen Div HEX('100') Div HEX('100')); data_regs.tcm := chr(at until (not psns.req) or (ints.ints <> 0); b := ord(data_regs.temp); end else {output operation} begin data_regs.temp := chr(b); scmd.cmd := set_ack_req_cmd; repeat until (not psns.req) or (ints.ints <> 0); end; if (ints.inXferBufBlock.BufLen Div HEX('100')); data_regs.tcl := chr(XferBufBlock.BufLen); { tell the chip which phase we expect to xfer in. } pctl.t_phase := XferPhase; { the transfer protocol (synchronous or asynchrnous) has already been se     tic transfer. } hwiAXfer(XferBlock, PtrScsiChip); { don't need to wait for chip to finish up work because waiting for an interrupt below. Interrupts handled here are: cmd_complete, svc_required, and spc_hard_err. } { an inTRUE; sctl.cr := FALSE; utlSetInternalErr(pSB, ScsiInteruptErr); goto 1; end; end; {with} hwiProgXfer := true; 1: end; {************************************************************************* * hwiStartDMAXfer ***********************terrupt of some kind must come through, wait for it. } if (ints.ints = 0) then begin osdStartTimer(one_second); repeat until (ints.ints <> 0) or osdTimeExpired; if (ints.ints = 0) then begin utlSetInternalErr(pSB, ScsiXferErr); go************************************************** * * On Input: The bus is in the desired phase and the target is requesting * data be transfered (direction of transfer will be based on * what is on the bus). The XferBlock in the to 1; end; end; 2: Saveints.ints := ints.ints; ints.ints := ints.ints; if serr.serr <> 0 then Saveints.spc_hard_err := true; if (Saveints.spc_hard_err) then begin Saveints.spc_hard_err := false; { call hwiGetMsgOut which willInternalBlock has * been set up. * * The DMA channel has been determined and is stored in the * InternalBlock. * * Functional Description: * * Set up the hardware for a DMA transfer, and set up for an * inte force the bus to message out phase (if target still expects to xfer data, this routine will pump no-op data, or read and throw away data, until message out phase has been granted. } hwiGetMsgOut(pSB, ResultCode); if (ResultCode = ord(rrupt to occur from the CHIP only! DMA should not cause * an interrupt. * * On Output: DMA started. * *************************************************************************} function hwiStartDMAXfer(pSB:PtrSessionBlockType):boolean; var CouScsiErr)) then goto 1; { reset the transfer control hardware on the chip/card. } sctl.cr := TRUE; sctl.cr := FALSE; end; if (Saveints.svc_required) then begin Saveints.svc_required := false; { get the residual countnt:integer; locsc_reg:sc_reg_type; begin hwiStartDMAXfer := true; with pSB^.InternalBlock, pScBlock^, PtrScsiCard^, PtrScsiChip^ do begin { make sure the SCSI card is not doing DMA! } sc_reg.d_enab_0 := false; sc_reg.d_enab_1 := false; co from tch, tcm, and tcl; this is the new buffer length. Adjust the buffer pointer to point to the next byte to be transfered. } XferBufBlock.BufLen := (ord(data_regs.tch) * HEX('100') * HEX('100')) + (ord(data_regs.tcm) * HEX('10nfig_reg.pal_reset := 0; { set up and arm the DMA card. On entry, DMA32bit indicates the SCSI card DMA capabilities. On exit, DMA32bit indicates how the card was setup. } DMA32bit := not id_reg.d16; osdSetUpDMAChannel(DMAChannel, DMA0')) + ord(data_regs.tcl); XferBufBlock.BufPtr := addr(XferSavedDataPointer^, XferSavedDataLength - XferBufBlock.BufLen); { reset the transfer control hardware on the chip/card. } sctl.cr := TRUE; sctl.cr := FALSE32bit, XferBlock); { set up and arm the Fujitsu CHIP } ints.ints := 0; Count := XferBlock.XferDMACount; data_regs.tch := chr(Count Div HEX('100') Div HEX('100')); data_regs.tcm := chr(Count Div HEX('100')); data_regs.tcl := chr(Count); ; end; if (Saveints.cmd_complete) then begin Saveints.cmd_complete := false; end; if (Saveints.ints <> 0) {an unexpected interrupt has occured} then begin { reset the transfer control hardware on the chip/card. } sctl.cr :=  pctl.t_phase := XferBlock.XferPhase; scmd.scmd := transfer_dmax; { wait for chip to accept the transfer command. if an interrupt has occured, then this is an error. } if (ssts.action <> spc_init_xfer) or (ints.ints <> 0) then begin      ed (because of * the 128K max transfer limitation with 16bit DMA) return FALSE to * indicate DMA transfer did not end, otherwise TRUE. * * Appropriate SCSI errors are placed in SessionBlock and ResultCode is set. * * On Output: DMA trbeen granted. } hwiGetMsgOut(pSB, ResultCode); end; end else if (XferPhase = data_in_phase) then begin { if this is an input DMA operation, then wait for DMA to catch up to SCSI chip. If DMA won't (osdStopDMA = false), tansfer either stopped or killed. H/W properly reset. * FALSE is returned if DMA transfer must be continued, TRUE otherwise. * ResultCode is set to ScsiErr if an error has occured, NoEvent otherwise. * ****************************************hen data has been lost. (This is not necessary for output, because the count on the SCSI chip reflects what actually has been transfered.) } if (not osdStopDMA(DMAChannel, DMA32bit, DMAStopCount)) then begin utlSetInternalErr(pSB, osdStartTimer(one_second); repeat until (ssts.action = spc_init_xfer) or (ints.ints <> 0) or osdTimeExpired; if (ssts.action <> spc_init_xfer) or (ints.ints <> 0) then begin hwiStartDMAXfer := FALSE; utlSetInternalErr(pSB, ScsiCatastrop*********************************} function hwiEndDMAXfer(pSB:PtrSessionBlockType; Var ResultCode:S_SHORT):Boolean; var Saveints:ints_type; AmtXfered,DMAStopCount:integer; begin with pSB^.InternalBlock, XferBlock, pScBlock^, PtrScsiChip^, PtrScsiCard^ hicErr); end; end; { if no errors have occured, then o set up the software to handle an interrupt. o enable interrupts o set up and enable the card to do DMA. - this will start the DMA process. } if (ssts.action = spcdo begin sc_reg.ie := false; ISRWaiting := false; ResultCode := ord(NoEvent); hwiEndDMAXfer := TRUE; Saveints.ints := ints.ints; ints.ints := ints.ints; if (ISRError) or (serr.serr <> 0) then Saveints.spc_hard_err := true; DMAStopCount_init_xfer) and (ints.ints = 0) then begin ISRWaiting := true; ISRMask := cmd_complete + svc_required + spc_hard_err; locsc_reg.control := 0; locsc_reg.ie := true; if DMA32bit then locsc_reg.dma_32 := true; if XferBlock.XferPhase =  := (ord(data_regs.tch) * HEX('100') * HEX('100')) + (ord(data_regs.tcm) * HEX('100')) + ord(data_regs.tcl); AmtXfered := XferDMACount - DMAStopCount; XferBufBlock.BufLen := XferBufBlock.BufLen - AmtXfered; { note, use XferSavedDataPdata_in_phase then locsc_reg.dma_dir := true; { 375 h/w problem, write dma enable last!!!! } sc_reg.control := locsc_reg.control; if DMAChannel = 1 then sc_reg.d_enab_1 := true else sc_reg.d_enab_0 := true; end; end; end; {***ointer instead of BufPtr because the absolute address from the beginning of the transfer is being calculated. } XferBufBlock.BufPtr := addr(XferSavedDataPointer^, XferSavedDataLength - XferBufBlock.BufLen); if (Saveints.spc_hard_err) then ********************************************************************** * hwiEndDMAXfer ************************************************************************* * * On Input: * * An interrupt (from the SCSI chip) has occured indicating the curr begin Saveints.spc_hard_err := false; { Reset the DMA channel. } osdKillDMA(DMAChannel); { reset the transfer control hardware on the chip/card. } sctl.cr := TRUE; sctl.cr := FALSE; if ISRError then ResultCode :=ent * DMA transfer has halted. * * Functional Description: * * Determine the number of bytes transferred, and adjust * XferBlock. Determine the cause for the interrupt, and reset * H/W accordingly. If transfer should be continu ord(ScsiErr) else begin { call hwiGetMsgOut which will force the bus to message out phase (if target still expects to xfer data, this routine will pump no-op data, or read and throw away data, until message out phase has      ScsiXferErr); ResultCode := ord(ScsiErr); end; end else osdKillDMA(DMAChannel); if (Saveints.svc_required) then begin Saveints.svc_required := false; { reset the transfer control hardware on the chip/card. } sctl.cr := T_4 standard * MESSAGES_msgGetMsg *$event_pairs_catch * Synch,state_5 * ScsiErr,state_exit * state_6 ******************************************************* *state_5 standard * RUE; sctl.cr := FALSE; end; if (Saveints.cmd_complete) then begin Saveints.cmd_complete := false; if (ResultCode <> ord(ScsiErr)) and (XferBufBlock.BufLen > 0) then hwiEndDMAXfer := FALSE; {still more data to be xfered} end; if (S MESSAGES_msgTargetSynchParms * HWI_UTILS_hwiGetPhase *$event_pairs_catch * state_exit ******************************************************* *state_6 standard * MESSAGES_msgRejectMsg * HWIaveints.ints <> 0) {an unexpected interrupt has occured} then begin utlSetInternalErr(pSB, ScsiInteruptErr); ResultCode := ord(ScsiErr); { reset the transfer control hardware on the chip/card. } sctl.cr := TRUE; sctl.cr := FALSE; _UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * MsgOut,state_2 * state_exit ******************************************************* *exec_err standard * COMMANDS_cmdStateErr *$event_pai end; { reset the igor PAL after every DMA transfer. } sc_reg.d_enab_1 := false; sc_reg.d_enab_0 := false; config_reg.pal_reset := 1; end; end; end; rs_catch * state_exit ******************************************************* *state_exit mexit * 0 ******************************************************* *$end_machine REFA COMMANDS_CMDSTATEERR LMODE COMMANDS_CMDSTATE INCLUDE ST_EQU *$machine_name EstablishPath *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgSelect * HWI_UTILS_hwiGetPhase *$event_pairs_catch * ERR REFA MESSAGES_MSGREJECTMSG LMODE MESSAGES_MSGREJECTMSG REFA MESSAGES_MSGTARGETSYNCHPARMS LMODE MESSAGES_MSGTARGETSYNCHPARMS REFA MESSAGES_MSGGETMSG LMODE MESSAGES_MSGGETMSG REFA MESSAGES_MSGINITSYNCHPARMS LMODE MESSAGES_MSGINITSYNCH WaitForIsr,state_1a * MsgOut,state_2 * state_exit ******************************************************* *state_1a suspend * state_1 ******************************************************* *state_2 PARMS REFA MESSAGES_MSGIDENTIFYMSG LMODE MESSAGES_MSGIDENTIFYMSG REFA HWI_UTILS_HWIGETPHASE LMODE HWI_UTILS_HWIGETPHASE REFA MESSAGES_MSGSELECT LMODE MESSAGES_MSGSELECT STANDARD equ 0 MCALL equ 1 MEXIT equ 2 SUSPEND equ 3 DONE_EXIT equ 4 SIN standard * MESSAGES_msgIdentifyMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * NeedSynchParms,state_3 * MsgIn,state_4 * ScsiErr,state_exit * state_exit ***************GLES equ 0 SINGLES_CATCH equ 1 PAIRS equ 2 PAIRS_CATCH equ 3 DEF ESTABLISHPATH ESTABLISHPATH dc.w EXEC_ERR-ESTABLISHPATH STATE_1 dc.b STANDARD,PAIRS_CATCH dc.b 3,2 dc.w WAITFORISR,STATE_1A-ESTABLISHPATH dc.w MSGOUT,STATE_2**************************************** *state_3 standard * MESSAGES_msgInitSynchParms * HWI_UTILS_hwiGetPhase *$event_pairs_catch * state_exit ******************************************************* *state-ESTABLISHPATH dc.w 000,STATE_EXIT-ESTABLISHPATH dc.l MESSAGES_MSGSELECT dc.l HWI_UTILS_HWIGETPHASE STATE_1A dc.b SUSPEND,SINGLES dc.w STATE_1-ESTABLISHPATH STATE_2 dc.b STANDARD,PAIRS_CATCH dc.b 4,2 dc.w NEED     state_2 ******************************************************* *state_2 standard * MESSAGES_msgDoXfer * HWI_UTILS_hwiGetPhase *$event_pairs_catch * WaitForISR,state_2a * MsgIn,state_4 * S_msgWaitReselect *$event_pairs_catch * WaitForISR,state_9a * MsgIn,state_4 * ScsiErr,state_exit * state_exit ******************************************************* *state_9a suspend *  MsgOut,state_3 * state_exit ******************************************************* *state_2a suspend * state_2 ******************************************************* *state_3 standard * MESSA state_9 ******************************************************* *state_10 standard * MESSAGES_msgIsOriginalPhase *$event_pairs_catch * OriginalPhase,state_2 * state_exit ********************************SYNCHPARMS,STATE_3-ESTABLISHPATH dc.w MSGIN,STATE_4-ESTABLISHPATH dc.w SCSIERR,STATE_EXIT-ESTABLISHPATH dc.w 000,STATE_EXIT-ESTABLISHPATH dc.l MESSAGES_MSGIDENTIFYMSG dc.l HWI_UTILS_HWIGETPHASE STATE_EXIT dc.b MEXIT,SINGLES dcGES_msgSawErrMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * state_exit ******************************************************* *state_4 standard * MESSAGES_msgGetMsg *$event_.w 0 STATE_3 dc.b STANDARD,PAIRS_CATCH dc.b 1,2 dc.w 000,STATE_EXIT-ESTABLISHPATH dc.l MESSAGES_MSGINITSYNCHPARMS dc.l HWI_UTILS_HWIGETPHASE STATE_4 dc.b STANDARD,PAIRS_CATCH dc.b 3,1 dc.w SYNCH,STATE_5-ESTABpairs_catch * SaveDataPtr,state_5 * Identify,state_6 * RestorePtrs,state_6 * Disconnect,state_7 * Synch,state_12 * ScsiErr,state_exit * state_8 **************LISHPATH dc.w SCSIERR,STATE_EXIT-ESTABLISHPATH dc.w 000,STATE_6-ESTABLISHPATH dc.l MESSAGES_MSGGETMSG STATE_5 dc.b STANDARD,PAIRS_CATCH dc.b 1,2 dc.w 000,STATE_EXIT-ESTABLISHPATH dc.l MESSAGES_MSGTARGETSYNCHPARMS dc.l ***************************************** *state_5 standard * MESSAGES_msgPrepareDisc * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * state_10 ************************************HWI_UTILS_HWIGETPHASE STATE_6 dc.b STANDARD,PAIRS_CATCH dc.b 3,2 dc.w MSGIN,STATE_4-ESTABLISHPATH dc.w MSGOUT,STATE_2-ESTABLISHPATH dc.w 000,STATE_EXIT-ESTABLISHPATH dc.l MESSAGES_MSGREJECTMSG dc.l HWI_UTILS_HWIGETPHASE ******************* *state_6 standard * MESSAGES_msgPrepareRetry * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * state_10 ******************************************************* * EXEC_ERR dc.b STANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_EXIT-ESTABLISHPATH dc.l COMMANDS_CMDSTATEERR * state trace table OPTION = TABLE OFF END state_7 standard * MESSAGES_msgSetDisc *$event_pairs * BusFree,state_9 * ScsiErr,state_exit ******************************************************* *state_8 standard * MESSAGES_msgReject INCLUDE ST_EQU *$machine_name DoTransfer *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgSetXfer *$event_pairs_catch * ScsiErr,state_exit * Msg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * ScsiErr,state_exit * state_10 ******************************************************* *state_9 standard * MESSAGE     *********************** *state_12 standard * MESSAGES_msgTargetSynchParms * HWI_UTILS_hwiGetPhase *$event_pairs_catch * ScsiErr,state_exit * state_10 ******************************************** dc.w STATE_2-DOTRANSFER STATE_4 dc.b STANDARD,PAIRS_CATCH dc.b 7,1 dc.w SAVEDATAPTR,STATE_5-DOTRANSFER dc.w IDENTIFY,STATE_6-DOTRANSFER dc.w RESTOREPTRS,STATE_6-DOTRANSFER dc.w DISCONNECT,STATE_7-DOTRANSFER dc.w*********** *exec_err standard * COMMANDS_cmdStateErr *$event_pairs_catch * state_exit ******************************************************* *state_exit mexit * 0 *************************************** SYNCH,STATE_12-DOTRANSFER dc.w SCSIERR,STATE_EXIT-DOTRANSFER dc.w 000,STATE_8-DOTRANSFER dc.l MESSAGES_MSGGETMSG STATE_3 dc.b STANDARD,PAIRS_CATCH dc.b 2,2 dc.w MSGIN,STATE_4-DOTRANSFER dc.w 000,STATE_EXIT-DOTRANS**************** *$end_machine REFA COMMANDS_CMDSTATEERR LMODE COMMANDS_CMDSTATEERR REFA MESSAGES_MSGTARGETSYNCHPARMS LMODE MESSAGES_MSGTARGETSYNCHPARMS REFA MESSAGES_MSGISORIGINALPHASE LMODE MESSAGES_MSGISORIGINALPHASE REFA MESSAGES_MSGWFER dc.l MESSAGES_MSGSAWERRMSG dc.l HWI_UTILS_HWIGETPHASE STATE_5 dc.b STANDARD,PAIRS_CATCH dc.b 2,2 dc.w MSGIN,STATE_4-DOTRANSFER dc.w 000,STATE_10-DOTRANSFER dc.l MESSAGES_MSGPREPAREDISC dc.l HWI_UTILS_HWIGETPHASE STATAITRESELECT LMODE MESSAGES_MSGWAITRESELECT REFA MESSAGES_MSGREJECTMSG LMODE MESSAGES_MSGREJECTMSG REFA MESSAGES_MSGSETDISC LMODE MESSAGES_MSGSETDISC REFA MESSAGES_MSGPREPARERETRY LMODE MESSAGES_MSGPREPARERETRY REFA MESSAGES_MSGPREPAREDIE_6 dc.b STANDARD,PAIRS_CATCH dc.b 2,2 dc.w MSGIN,STATE_4-DOTRANSFER dc.w 000,STATE_10-DOTRANSFER dc.l MESSAGES_MSGPREPARERETRY dc.l HWI_UTILS_HWIGETPHASE STATE_7 dc.b STANDARD,PAIRS dc.b 2,1 dc.w BUSFREESC LMODE MESSAGES_MSGPREPAREDISC REFA MESSAGES_MSGGETMSG LMODE MESSAGES_MSGGETMSG REFA MESSAGES_MSGSAWERRMSG LMODE MESSAGES_MSGSAWERRMSG REFA HWI_UTILS_HWIGETPHASE LMODE HWI_UTILS_HWIGETPHASE REFA MESSAGES_MSGDOXFER LMODE MESSAGES_MSG,STATE_9-DOTRANSFER dc.w SCSIERR,STATE_EXIT-DOTRANSFER dc.l MESSAGES_MSGSETDISC STATE_12 dc.b STANDARD,PAIRS_CATCH dc.b 2,2 dc.w SCSIERR,STATE_EXIT-DOTRANSFER dc.w 000,STATE_10-DOTRANSFER dc.l MESSAGES_MSGTARGETSYNCHPARMSDOXFER REFA MESSAGES_MSGSETXFER LMODE MESSAGES_MSGSETXFER STANDARD equ 0 MCALL equ 1 MEXIT equ 2 SUSPEND equ 3 DONE_EXIT equ 4 SINGLES equ 0 SINGLES_CATCH equ 1 PAIRS equ 2 PAIRS_CATCH equ 3 DEF DOTRANSFER DOTRANSFER dc.w EXEC_ERR-DOTRANSFE dc.l HWI_UTILS_HWIGETPHASE STATE_8 dc.b STANDARD,PAIRS_CATCH dc.b 3,2 dc.w MSGIN,STATE_4-DOTRANSFER dc.w SCSIERR,STATE_EXIT-DOTRANSFER dc.w 000,STATE_10-DOTRANSFER dc.l MESSAGES_MSGREJECTMSG dc.l HWI_UTILS_HWIGETPHASER STATE_1 dc.b STANDARD,PAIRS_CATCH dc.b 2,1 dc.w SCSIERR,STATE_EXIT-DOTRANSFER dc.w 000,STATE_2-DOTRANSFER dc.l MESSAGES_MSGSETXFER STATE_EXIT dc.b MEXIT,SINGLES dc.w 0 STATE_2 dc.b STANDARD,PAIRS_CATCH  STATE_10 dc.b STANDARD,PAIRS_CATCH dc.b 2,1 dc.w ORIGINALPHASE,STATE_2-DOTRANSFER dc.w 000,STATE_EXIT-DOTRANSFER dc.l MESSAGES_MSGISORIGINALPHASE STATE_9 dc.b STANDARD,PAIRS_CATCH dc.b 4,1 dc.w WAITFORISR, dc.b 4,2 dc.w WAITFORISR,STATE_2A-DOTRANSFER dc.w MSGIN,STATE_4-DOTRANSFER dc.w MSGOUT,STATE_3-DOTRANSFER dc.w 000,STATE_EXIT-DOTRANSFER dc.l MESSAGES_MSGDOXFER dc.l HWI_UTILS_HWIGETPHASE STATE_2A dc.b SUSPEND,SINGLESSTATE_9A-DOTRANSFER dc.w MSGIN,STATE_4-DOTRANSFER dc.w SCSIERR,STATE_EXIT-DOTRANSFER dc.w 000,STATE_EXIT-DOTRANSFER dc.l MESSAGES_MSGWAITRESELECT STATE_9A dc.b SUSPEND,SINGLES dc.w STATE_9-DOTRANSFER EXEC_ERR dc.b      RFREE REFA MESSAGES_MSGGETMSG LMODE MESSAGES_MSGGETMSG STANDARD equ 0 MCALL equ 1 MEXIT equ 2 SUSPEND equ 3 DONE_EXIT equ 4 SINGLES equ 0 SINGLES_CATCH equ 1 PAIRS equ 2 PAIRS_CATCH equ 3 DEF TERMINATEPATH TERMINATEPATH dc.w EXEC_ERR-TERMINATE 0 ******************************************************* *$end_machine REFA COMMANDS_CMDSTATEERR LMODE COMMANDS_CMDSTATEERR REFA HWI_UTILS_HWIGETPHASE LMODE HWI_UTILS_HWIGETPHASE REFA MESSAGES_MSGABORTMSG LMODE MESSAGES_MSGABORTMPATH STATE_1 dc.b STANDARD,PAIRS_CATCH dc.b 3,1 dc.w CMDCOMPLETE,STATE_2-TERMINATEPATH dc.w SCSIERR,STATE_EXIT-TERMINATEPATH dc.w 000,STATE_3-TERMINATEPATH dc.l MESSAGES_MSGGETMSG STATE_2 dc.b STANDARD,PAIRS_CATSG REFA HWI_UTILS_HWIGETMSGOUT LMODE HWI_UTILS_HWIGETMSGOUT REFA MESSAGES_MSGISPATHACTIVE LMODE MESSAGES_MSGISPATHACTIVE STANDARD equ 0 MCALL equ 1 MEXIT equ 2 SUSPEND equ 3 DONE_EXIT equ 4 SINGLES equ 0 SINGLES_CATCH equ 1 PAIRS equ 2 PAIRS_CATC STANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_EXIT-DOTRANSFER dc.l COMMANDS_CMDSTATEERR * state trace table OPTION = TABLE OFF END CH dc.b 1,1 dc.w 000,STATE_EXIT-TERMINATEPATH dc.l MESSAGES_MSGWAITTIMEORFREE STATE_EXIT dc.b MEXIT,SINGLES dc.w 0 STATE_3 dc.b STANDARD,PAIRS_CATCH dc.b 2,2 dc.w MSGIN,STATE_1-TERMINATEPATH dc.w 000,STATE_ INCLUDE ST_EQU *$machine_name TerminatePath *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgGetMsg *$event_pairs_catch * CmdComplete,state_2 * EXIT-TERMINATEPATH dc.l MESSAGES_MSGREJECTMSG dc.l HWI_UTILS_HWIGETPHASE EXEC_ERR dc.b STANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_EXIT-TERMINATEPATH dc.l COMMANDS_CMDSTATEERR * state trace table OPTION = TABLE OFF END  ScsiErr,state_exit * state_3 ******************************************************* *state_2 standard * MESSAGES_msgWaitTimeOrFree *$event_pairs_catch * state_exit *************************************** INCLUDE ST_EQU *$machine_name AbortPath *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgIsPathActive *$event_pairs_catch * NoEvent,state_2 * **************** *state_3 standard * MESSAGES_msgRejectMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_1 * state_exit ******************************************************* *exec state_exit ******************************************************* *state_2 standard * HWI_UTILS_hwiGetMsgOut *$event_pairs * MsgOut,state_3 * ScsiErr,state_exit * BusFree,state_exit * _err standard * COMMANDS_cmdStateErr *$event_pairs_catch * state_exit ******************************************************* *state_exit mexit * 0 *******************************************************  BusBusy,state_exit ******************************************************* *state_3 standard * MESSAGES_msgAbortMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * ScsiErr,state_exit * sta*$end_machine REFA COMMANDS_CMDSTATEERR LMODE COMMANDS_CMDSTATEERR REFA HWI_UTILS_HWIGETPHASE LMODE HWI_UTILS_HWIGETPHASE REFA MESSAGES_MSGREJECTMSG LMODE MESSAGES_MSGREJECTMSG REFA MESSAGES_MSGWAITTIMEORFREE LMODE MESSAGES_MSGWAITTIMEOte_exit ******************************************************* *exec_err standard * COMMANDS_cmdStateErr *$event_pairs_catch * state_exit ******************************************************* *state_exit mexit *      H equ 3 DEF ABORTPATH ABORTPATH dc.w EXEC_ERR-ABORTPATH STATE_1 dc.b STANDARD,PAIRS_CATCH dc.b 2,1 dc.w NOEVENT,STATE_2-ABORTPATH dc.w 000,STATE_EXIT-ABORTPATH dc.l MESSAGES_MSGISPATHACTIVE STATE_2 dc.b S the hardware } hwiSCInitHW(sc); { get space for the SCSI driver table. Initialize it to the contents of the system driver table. update the pointer in the isc_table to the SCSI driver table. } newbytes(pScsiDvrTable, sizeof(TANDARD,PAIRS dc.b 4,1 dc.w MSGOUT,STATE_3-ABORTPATH dc.w SCSIERR,STATE_EXIT-ABORTPATH dc.w BUSFREE,STATE_EXIT-ABORTPATH dc.w BUSBUSY,STATE_EXIT-ABORTPATH dc.l HWI_UTILS_HWIGETMSGOUT STATE_EXIT dc.b MEXIT,SINGLES dc.w drv_table_type)); pScsiDvrTable^ := PtrScsiDvrType(io_drv_ptr)^; PtrScsiDvrType(io_drv_ptr) := pScsiDvrTable; { initialize the SCSI driver table to our procedures. } io_drv_ptr^.iod_tfr := ScsiIOD_TFR; io_drv_ptr^.iod_init := ScsiIO0 STATE_3 dc.b STANDARD,PAIRS_CATCH dc.b 2,2 dc.w SCSIERR,STATE_EXIT-ABORTPATH dc.w 000,STATE_EXIT-ABORTPATH dc.l MESSAGES_MSGABORTMSG dc.l HWI_UTILS_HWIGETPHASE EXEC_ERR dc.b STANDARD,PAIRS_CATCH dc.b 1,1 dD_INIT; end; end; if card_found then markuser; end; end; c.w 000,STATE_EXIT-ABORTPATH dc.l COMMANDS_CMDSTATEERR * state trace table OPTION = TABLE OFF END { This module interfaces the scsi driver to the lowest parts of an O/S. This module is responsible for allowing access to the SelectCodeBlock, allowing one to read and set interrupt levels, interfacing the interrupt level routine to the o/s's interrupmodule OSD_HL; export Procedure osdhStartUp; implement import sysglobals, GENERAL_0, SCSI_DEFS,OSD_LL,HWI_UTILS,COMMANDS,SCSI_ISR, LOADER, IODECLARATIONS, ASM; Procedure ScsiIOD_TFR(temp, v:ANYPTR); var i:integer; begin i := ord(temp); if it handling mechanism, etc. } MODULE OSD_LL; {Operating System Dependent Low Level interface} import SCSI_DEFS, OSD_LLA, IODECLARATIONS, GENERAL_0, SYSGLOBALS, ISR, ASM, IOCOMASM; export const one_second = 1000; { Driver Initialization routin = 0 then DoSession(v) else if i = 1 then DoAbort(v) else if i = 2 then begin i := ord(v); DoReset(i); end; end; Procedure ScsiIOD_INIT(temp:ANYPTR); begin { temp is an pio_tmp_ptr. } cmdScCleanUp(pio_tmp_ptr(temp)^.my_isc); end; Proces } Procedure osdInitScBlock(Sc:S_TYPE_ISC); Function osdGetScBlock(Sc:S_TYPE_ISC):PtrSelectCodeBlockType; Procedure osdLinkIsrRoutine(IsrProc:ScsiIsrProcType; Sc:S_TYPE_ISC); { Timer Routines } Procedure osdDelay(ms:integer); Procedure osdStedure osdhStartUp; type PtrScsiDvrType=^drv_table_type; var card_found:boolean; sc:TYPE_ISC; pScsiDvrTable:PtrScsiDvrType; begin card_found:= false; for sc := minrealisc to maxrealisc do with isc_table[sc] do begin if (card_ptr <> nil) and (artTimer(ms:integer); Function osdTimeExpired:boolean; { General O/S specific routines } Function osdGetRunLevel:io_byte; Procedure osdSetRunLevel(Level:io_byte); Function osdBitOr(b1,b2:integer):integer; Function osdBitAnd(b1,b2:integer):incard_type = scsi_card) then begin card_found := true; { Initialize this card's select code block and link the scsi ISR routine into this select code. } osdInitScBlock(sc); osdLinkIsrRoutine(isrScsiIsr, sc); { Initializeteger; Function osdBitLsL(b,Num:integer):integer; Function osdBitLsR(b,Num:integer):integer; { DMA routines } Function osdDMA32bit:boolean; Function osdGetDMAChannel(Sc:S_TYPE_ISC):integer; Procedure osdSetUpDMAChannel(Channel:integer; var D     te; var PtrMiscTemplate:PtrMiscTemplateType; i:ScsiDeviceType; begin with isc_table[Sc] do begin PtrMiscTemplate := addr(io_tmp_ptr^.drv_misc[1]); with PtrMiscTemplate^ do begin newbytes(MiscpScBlock, sizeof(SelectCodeBlockType)); with MiselectCodeBlock, * get and call the SCSI Driver ISR routine. * * On Output: SCSI Driver ISR routine is linked into the O/S. * *************************************************************************} Procedure osdScsiIsr(isribptr:pisrib)cpScBlock^ do begin for i := 0 to 7 do begin DeviceSessionPtrs[i] := nil; DeviceSynchParms[i].SynchState := NoSynch; DeviceSynchParms[i].TMODvalue.tmod := 0; end; PtrScsiCard := card_ptr; PtrScsiChip := addr(PtrChar(Pt; var io_ptr:pio_tmp_ptr; pScBlock:PtrSelectCodeBlockType; begin io_ptr := pio_tmp_ptr(isribptr); pScBlock := osdGetScBlock(io_ptr^.my_isc); call(pScBlock^.ScsiIsrProc, io_ptr^.my_isc); end; Procedure osdLinkIsrRoutine(IsrProc:ScsiIsrProcType; Sc:S_TMA32bit:boolean; var XferBlock:XferBlockType); Procedure osdKillDMA(Channel:integer); Function osdStopDMA(Channel:integer; DMA32bit:boolean; StopCount:integer):boolean; Procedure osdReleaseDMAChannel(Sc:S_TYPE_ISC); implement { define record structrScsiCard)^,32); ScsiIntLevel := PtrScsiCard^.sc_reg.intlevel+3; ScsiSelectCode := Sc; DMAInProgress := FALSE; DMAChannel := -1; end; newbytes(MiscpSenseSpace, 256); MiscSenseLength := 0; end; end; end; {***********************ures for the DMA registers } type Channel16BitType = packed record address:ANYPTR; count:S_SHORT; cont_stat:S_SHORT; end; Channel32BitType = packed record address:ANYPTR; count:integer; cont_stat:S_SHORT; end; Channel32BitGeneralType = p************************************************** * osdGetScBlock ************************************************************************* * * On Input: nothing expected. * * * Functional Description: * * Given a select code, return a poinacked record id1:S_SHORT; id2:S_SHORT; case integer of 1:(control:S_SHORT); 2:(pad :0..hex('3ff'); reset1 :boolean; reset0 :boolean; bt :0..hex('3'); br :0..hex('3')); end; var timer:timer_rec; {*************ter to the SelectCode block. * * On Output: Ptr to SelectCodeBlock or Nil. * *************************************************************************} Function osdGetScBlock(Sc:S_TYPE_ISC):PtrSelectCodeBlockType; type ppScBlock = ^PtrSelectCodeBlock************************************************************ * osdInitScBlock ************************************************************************* * * On Input: nothing expected. * * * Functional Description: * * Acquire memory for a SeType; begin with isc_table[Sc] do begin if (card_type = scsi_card) then osdGetScBlock := ppScBlock(addr(io_tmp_ptr^.drv_misc[1]))^ else osdGetScBlock := Nil; end; end; {************************************************************************lect Code Block (defined in SCSI_DEFS), * hook the memory into a memory chain accessible through a select * code, and initialize. * * On Output: SelectCode block acquired, hooked into the O/S and initialized. * ***************************** * osdLinkIsrRoutine ************************************************************************* * * On Input: nothing expected. * * * Functional Description: * * Takes as paramters a select code and an ISR routine. The ISR * routine i*********************************************} Procedure osdInitScBlock(Sc:S_TYPE_ISC); type MiscTemplate = packed record MiscpScBlock:PtrSelectCodeBlockType; MiscpSenseSpace:PtrChar; MiscSenseLength:integer; end; PtrMiscTemplateType = ^MiscTemplas linked into the O/S for the given Select Code. * * The ISR routine address can be stored off of the SelectCodeBlock. * * PWS implmentation: Use a procedure that can recieve an ISRIB. * From this get the select code, get the S     YPE_ISC); var pScBlock:PtrSelectCodeBlockType; pCard:PtrScsiCardType; p:ANYPTR; begin pScBlock := osdGetScBlock(Sc); with isc_table[Sc], io_tmp_ptr^, pScBlock^, pScBlock^.PtrScsiCard^ do begin { Check for ISR already in place. } if myisrib.***} Procedure osdStartTimer(ms:integer); begin timer.time := ms; start_timer(timer); end; Function osdTimeExpired:boolean; begin osdTimeExpired := time_expired(timer); end; {************************************************************************* intregaddr <> nil then {isr already exits} begin { unlink existing isr hook. } isrunlink(ScsiIntLevel, addr(myisrib)); end; ScsiIsrProc := IsrProc; p := addr(sc_reg,1); {sc_reg.status, compiler won't let me otherwise} permisrlink( * osdGetRunLevel ************************************************************************* * * On Input: nothing expected. * * * Functional Description: * * Returns the current run level of the 680x0 processor. * * On Output: * * ******osdScsiIsr, p, hex('c0'), hex('c0'), ScsiIntLevel, addr(myisrib)); end; end; {************************************************************************* * osdDelay ************************************************************************* * * On I*******************************************************************} Function osdGetRunLevel:io_byte; begin osdGetRunLevel := intlevel; end; {************************************************************************* * osdSetRunLevel *****************nput: Nothing is expected. * * * Functional Description: * * Delay the given number of milliseconds. * * On Output: Nothing is changed, however the given number of milliseconds * has passed. * ************************************************************************************************** * * On Input: nothing expected. * * * Functional Description: * * Sets the current run level of the 680x0 processor to the requested * level. * * On Output: 680x0 run level is at*******************************} Procedure osdDelay(ms:integer); begin timer.time := ms; start_timer(timer); repeat until time_expired(timer); end; {************************************************************************* * osdStartTimer & osdTimeE requested level. * *************************************************************************} Procedure osdSetRunLevel(Level:io_byte); begin setintlevel(level); end; {************************************************************************* * Bit xpired ************************************************************************* * * On Input: Nothing is expected. * * * Functional Description: * * These two routines are used to start a timer that will expire after * a given number ofmanipulation routintes ************************************************************************* * * On Input: nothing expected. * * * Functional Description: * * * * On Output: * * ************************************************************* milliseconds and then check to see if the timer * has expired. * * They are used to wait while waiting for an event to happen, thus * preventing an eternal wait. * * On Output: osdStartTimer: the timer has been started - this should ************} Function osdBitOr(b1,b2:integer):integer; begin osdBitOr := binior(b1,b2); end; Function osdBitAnd(b1,b2:integer):integer; begin osdBitAnd := binand(b1,b2); end; Function osdBitLsL(b,Num:integer):integer; begin osdBitLsL := binlsl(b,Num); not * affect the driver in any way. osdTimeExpired: returns TRUE if the * timer has expired, FALSE otherwise. This routine should have no * affect on the driver. * **********************************************************************end; Function osdBitLsR(b,Num:integer):integer; begin osdBitLsR := binlsr(b,Num); end; {************************************************************************* * osdDMA32bit *************************************************************************     ********************************* * osdSetUpDMAChannel ************************************************************************* * * On Input: DMA is present, and a Channel has been acquired. * XferBlock.BufPtr is guaranteed to be on a word := TRUE; end; end; end; osdKillDMA(Channel); DMAPtr := isc_table[3].card_ptr; if Use32BitChannel then begin {Get pointers to DMA channel} p32Gen := addr(DMAPtr^,hex('10')); pChannel32 := addr(DMAPtr^,(Channel+1)*hex('100')); with  boundary and * XferBlock.BufLen is guaranteed to be an even length. * * Functional Description: * * Initialize and ARM the given DMA channel. The DMA H/W should * be set up to NOT interrupt. * * The incomming * DMA3p32Gen^, pChannel32^, XferBlock do begin {set bus control registers to 16 bit defaults} br := 0; bt := 2; {DMA address} address := XferBufBlock.BufPtr; { DMA Count. Can do the entire DMA in one go around, however the amount  * * On Input: nothing expected. * * * Functional Description: * * Determines if the current hardware supports 32 bit wide DMA. * * On Output: TRUE if 32bit wide DMA is supported; FALSE otherwise. * Modified to always FALSE due 2bit parameter indicates if the SCSI H/W can handle 32 bit DMA or * not, on exit DMA32bit should indicate if 32 bit DMA is being performed * or not. (NOTE: SCSI driver expects either 16 or 32 bit DMA - 8 bit DMA * is NOT acceptable). * to hardware bug - 27AUG91 - CFB * *************************************************************************} Function osdDMA32bit:boolean; var io_dummy_word:io_word; begin if dma_here then {from IODECLARATIONS} begin try io_dummy_word := ioread_w* XferBlock contains buffer address, length, and direction of transfer. * * Because 16bit DMA can only transfer 128K max, the amount of data being * transfered should be stored in the XferBlock (XferDMACount). The value * stored isord(3, hex('10')); if (io_dummy_word = hex('3230')) then {ascii'2', '0'} osdDMA32bit := true else osdDMA32bit := false; recover osdDMA32bit := false; end else osdDMA32bit := false; osdDMA32bit := false; {always false due to hardwar the actual number of bytes the DMA channel will transfer. * * On Output: DMA channel is initialized and ARMed. * *************************************************************************} Procedure osdSetUpDMAChannel(Channel:integer; var DMA32bit:booe bug 27AUG91 - CFB} end; {************************************************************************* * osdGetDMAChannel ************************************************************************* * * On Input: nothing expected. * * * Functional Deslean; var XferBlock:XferBlockType); var DMAPtr:PtrChar; Use32BitChannel:boolean; pChannel16:^Channel16BitType; pChannel32:^Channel32BitType; p32Gen:^Channel32BitGeneralType; i:integer; begin { Determine if a 16 or 32 bit channel should be used. cription: * * Acquire, if possible, a DMA Channel from the operating system. * Once acquired, this channel will be used by the SCSI Driver until * the SCSI driver releases it. * * On Output: 0 for channel 0, 1 for channel 1, -1 for no} Use32BitChannel := osdDMA32bit; { Determine what kind of DMA should be used, 16 or 32 bit. } if (DMA32bit) then begin DMA32bit := false; {prove that SPU can do 32 bit first.} {is 32 bit wide DMA available in the SPU?} if (Use32BitChannel channel. * * *************************************************************************} Function osdGetDMAChannel(Sc:S_TYPE_ISC):integer; begin osdGetDMAChannel := dma_request(isc_table[Sc].io_tmp_ptr); end; {****************************************) then begin {is the buffer on a long word boundary?} i := integer(XferBlock.XferBufBlock.BufPtr); if (i mod 4) = 0 then begin {is the length divisible by 4?} i := XferBlock.XferBufBlock.BufLen; if (i mod 4) = 0 then DMA32bit     of transfers depends on the width of the transfer. } XferDMACount := XferBufBlock.BufLen; if (DMA32bit) then count := (XferBufBlock.BufLen Div 4)-1 else count := (XferBufBlock.BufLen Div 2)-1; { Writing the start bit in thown. * * *************************************************************************} Procedure osdKillDMA(Channel:integer); var io_dummy_word:io_word; pGen32:^Channel32bitGeneralType; begin { Kill the 16 bit channel by reading the channel address re control register arms the DMA chip. } if (XferBlock.XferPhase = data_in_phase) then begin if DMA32bit then {start, 32bit, priority, input, word, no interrupt} cont_stat := hex('810A') else {start, 16bit, priority, input, wegister. } io_dummy_word := ioread_word(3, Channel*8); { Kill the 32 bit channel by specifically resetting the appropriate channel. } pGen32 := isc_table[3].card_ptr; pGen32 := addr(pGen32^, hex('10')); if Channel = 0 then pGen32^.reset0 :=ord, no interrupt} cont_stat := hex ('800A'); end else begin if DMA32bit then {start, 32bit, priority, output, word, no interrupt} cont_stat := hex('810E') else {start, 16bit, priority, output, word, no interrupt}  true else pGen32^.reset1 := true; { Flush the cache on 68020 and newer processors. - this happens automatically with dma_release. } end; {************************************************************************* * osdStopDMA ************cont_stat := hex('800E'); end; end; end else begin {Get pointer to DMA channel} pChannel16 := addr(DMAPtr^, Channel*8); with pChannel16^, XferBlock do begin {DMA address} address := XferBufBlock.BufPtr; {DMA count (in words). DMA************************************************************* * * On Input: DMA channel is actively transfering data. * * * Functional Description: * * Wait for the DMA channel to get to the desired count, and then kill it. * (After an ap count is 1 less than total request. 128K transfer MAX.} if XferBufBlock.BufLen >= hex('20000') then {len >= 128K} begin XferDMACount := hex('20000'); i := hex('ffff'); end else begin XferDMACount := XferBufBlock.BufLen; i :=propriate wait, kill the channel even if the desired count * hasn't been reached). * * On Output: TRUE: desired count reached and channel killed. * FALSE: desired count NOT reached, channel killed. * * ***************************** (XferBufBlock.BufLen Div 2)-1; end; count := i; { Writing the control register arms the DMA chip. } if (XferBlock.XferPhase = data_in_phase) then cont_stat := hex('000A') {priority, input, word, no interrupt} else cont_st********************************************} Function osdStopDMA(Channel:integer; DMA32bit:boolean; StopCount:integer):boolean; var DMAPtr:PtrChar; Use32BitChannel:boolean; pChannel32:^Channel32BitType; Count32:integer; pChannel16:^Channel16BitType; at := hex('000E'); {priority, output, word, no interrupt} end; end; end; {************************************************************************* * osdKillDMA ************************************************************************* * * On Input Count16:S_SHORT; begin Use32BitChannel := osdDMA32bit; osdStopDMA := true; DMAPtr := isc_table[3].card_ptr; if Use32BitChannel then begin {Get pointer to 32 bit DMA channel} pChannel32 := addr(DMAPtr^,(Channel+1)*hex('100')); with pChannel32^ d: DMA channel is actively transfering data. * * * Functional Description: * * shutdown active DMA Channel. * Force all data (instruction and data) in the processor's cache * to be flushed. * * On Output: active DMA channel is shutdo begin if DMA32bit then Count32 := (StopCount Div 4) - 1 else Count32 := (StopCount Div 2) - 1; if (count <> Count32) then begin {wait} osdStartTimer(one_second); repeat until (count <= Count32) or (osdTimeExpired);      equ 1 sysflag2 equ $FFFFFEDA REFA CHECK_TIMER in system POWERUP code LMODE CHECK_TIMER ************************************************************************* * START_TIMER timing setup * * ASSUMES: * Pascal Workstation SCSI onion skin. The file/module OSD_HL is responsible for interfacing the O/S to the scsi driver from a high level. (i.e. link into isc_table, get memory, and initialize system) The file/module OSD_LL is responsible for interfacin - sp+4 points to location of a timer record * the TIME field is a delay in milliseconds * RETURNS: * - The TIME field contains a value to match against the timer * (no timer present then this field is a scaled count) ***g the driver to the lowest levels. } PROGRAM PWS_SCSI{{(OUTPUT){for debug}; $SEARCH 'OSD_LLA', 'HWIA_UTIL'$ $PAGE$ $INCLUDE 'ST_PROCS'$ $PAGE$ $INCLUDE 'SCSI_DEFS'$ $PAGE$ $INCLUDE 'SCSI_UTIL'$ $PAGE$ $INCLUDE 'OSD_LL'$ $PAGE$ $INCLUDE 'HWI_UTILS'$ $PA if (count <> Count32) then osdStopDMA := false; end; end; end else begin {Get pointer to DMA channel} pChannel16 := addr(DMAPtr^, Channel*8); with pChannel16^ do begin Count16 := ((StopCount Div 2) - 1) MOD hex('10000'); if ********************************************************************** OSD_LLA_START_TIMER equ * movea.l 4(sp),a0 get addr of timer rec btst #timer_present,sysflag2 bne.s soft_start st 4(a0) set the first time flag jmp CHECK_TIM(count <> Count16) then begin {wait} osdStartTimer(one_second); repeat until (count <= Count16) or (osdTimeExpired); if (count <> Count16) then osdStopDMA := false; end; end; end; osdKillDMA(Channel); end; {************ER soft_start equ * * scale the time out value for use as a counter move.l (a0),d0 lsl.l #4,d0 x 16 move.l d0,(a0) move.l (sp)+,(sp) move the return address rts *************************************************************************************************************************** * osdReleaseDMAChannel ************************************************************************* * * On Input: Channel is NOT active. * * * Functional Description: * * Give the ch*********** * FUNCTION TIME_EXPIRED(VAR TIME: INTEGER):BOOLEAN; * ASSUMES: * - sp+4 points to a timer record (set up by start_timer) ************************************************************************* OSD_LLA_TIME_EXPIRED EQU * clr.b 8(sannel back to the O/S. * * On Output: * * *************************************************************************} Procedure osdReleaseDMAChannel(Sc:S_TYPE_ISC); begin {release a DMA channel} dma_release(isc_table[Sc].io_tmp_ptr); end; end; p) clear the function value btst #timer_present,sysflag2 bne.s soft_check move.l 4(sp),-(sp) copy the timer rec address jsr CHECK_TIMER bpl.s timex1 timex0 move.b #1,8(sp) timex1 move.l (sp)+,(sp) move the return add MNAME OSD_LLA SRC MODULE OSD_LLA; SRC IMPORT SCSI_DEFS, iodeclarations; SRC EXPORT SRC TYPE SRC TIMER_REC = RECORD SRC TIME : INTEGER; SRC FLAG : s_short; { MSR } SRC END;ress rts soft_check equ * movea.l 4(sp),a0 subq.l #1,(a0) bpl timex1 bra timex0 * * module initialization * OSD_LLA_OSD_LLA EQU * RTS end  SRC SRC PROCEDURE START_TIMER(VAR TIME : TIMER_REC); SRC FUNCTION TIME_EXPIRED(VAR TIME : TIMER_REC):BOOLEAN; SRC SRC END; { OSD_LLA } DEF OSD_LLA_OSD_LLA DEF OSD_LLA_START_TIMER DEF OSD_LLA_TIME_EXPIRED timer_present {system options} $modcal on$ $allow_packed on$ $partial_eval on$ {code generation options} $debug off$ $iocheck off$ $ovflcheck off$ $range off$ $stackcheck off$ {listing options} $lines 57$ $pagewidth 130$ $copyright 'Hewlett Packard Company, 1989'$ {       GE$ $INCLUDE 'STATE_DRV'$ $PAGE$ $INCLUDE 'MESSAGES'$ $PAGE$ $INCLUDE 'COMMANDS'$ $PAGE$ $INCLUDE 'SCSI_ISR'$ $PAGE$ $INCLUDE 'OSD_HL'$ $PAGE$ import OSD_HL; begin osdhStartUp; end. ufferBlockType = RECORD BufPtr:PtrS_byte; BufLen:integer; DoDMA:Boolean; END; SessionBlockType = RECORD {Caller sets before session} SelectCode:s_TYPE_ISC; Device:ScsiDeviceType; LUN:s_byte; SUN:s_byte; Overlap:Boo{system options} $modcal on$ $allow_packed on$ $partial_eval on$ {code generation options} $debug off$ $LINENUM 20000$ $iocheck on$ $ovflcheck on$ $range on$ $stackcheck on$ {listing options} $tables off$ $lines 57$ $pagewidth 130$ $copyright 'Hewlett Palean; DoNotDisconnect:Boolean; CmdPtr:ANYPTR; CmdLen:s_byte; BufIn:BufferBlockType; BufOut:BufferBlockType; SessionCompleteCallBack:ScsiCallBackType; {set by SCSI Bus Driver during session} SessionState:SessionStateType; ckard Company, 1989'$ {{ $search 'PWS_SCSI'$ {Needed for TDEBUG - Don't delete SCSIDVR symbols during LINK!} $PAGE$ { SCSI Interface Module. Contains a definition of all of the SCSI commands. and provides the routine ScsiHandleSession. It is intende SessionStatus:s_byte; InternalStatus:InternalErrType; ResidualCount: INTEGER; {Internal Use Only} {Trace set by caller} {InternalBlock used by driver} DoTrace:Boolean; TracePtr:ANYPTR; TraceSize:integer; TraceStuff:ANd that all outside users would search/link this module, using it to get inteface to the scsi driver. } module SCSILIB; import sysglobals, asm, iodeclarations {{, STATE_PROCS, LOADER{needed for TDEBUG}; export {---- begin of SCSIIF common. do not modifyYPTR; InternalBlock:PACKED ARRAY [1..128] of CHAR; END; {---- end of SCSIIF common. do not modify!!! above is copied from SCSI_DEFS during turn process} type uep_type = ^unitentry; mode_select_cmd_type = packed record op_code !!! below is copied from SCSI_DEFS during turn process} type s_byte = 0 .. 255; s_short = 0..65535; s_short_signed = -32768..32767; PtrS_byte = ^s_byte; PtrChar = ^char; s_TYPE_ISC = 0..31; const trace_size = 1000; type PtrSessionBlockType = ^S: byte; lunit : 0..7; pf : 0..1; rsvd1 : 0..7; sp : 0..1; rsvd2 : byte; rsvd3 : byte; reqlen : byte; pad2 : byte; end; mode_select_data_type = packed record ms_len : bytessionBlockType; ScsiDeviceType = 0 .. 7; InternalErrType = ( NoIntErr, ScsiStackingErr, RunLevelErr, StateMachineErr, ScsiInteruptErr, ScsiAddressErr, SelectRetryErr, ScsiManXferErr, ScsiXferErr, XferRetryErr, ScsiEscapeErr, ScsiPhe; medtype : byte; wp : boolean; rsvd1 : 0 .. 127; bd_len : byte; ms_data : packed array [ 0 .. 255 ] of char; end; PtrModeSenseDataType = ^mode_sense_data_type; PtrModeSelectDataType = ^mode_select_aseErr, ScsiCatastrophicErr, ScsiBadMsg, ScsiTimeOutErr, ScsiXferParmErr, ScsiMiscErr ); SessionStateType = ( SessionWaiting, {Session is initialized and waiting to be started.} SessionRunning, {Session running (State data_type; PtrDeviceAddressVectorsType = ^DeviceAddressVectorsType; DeviceAddressVectorsType = PACKED RECORD sc, {select code} ba, {bus address - Session Device} du, {device unit - Session LUN} dv {device volume - Session SUN} Machine is started)} SessionSuspended, {Target disconnected, bus released, awaiting reselection} SessionComplete {Session terminated, either normally or with an err} ); ScsiCallBackType = Procedure(pSB:PtrSessionBlockType); B:-128..127; END; procedure IsScsiCard( sc:S_TYPE_ISC; var b:boolean); procedure ScsiSBSize( var size:integer); procedure ScsiSBInit( pSB:ANYPTR; pDAV:ANYPTR); function ScsiHandleSession(pSB:PtrSessionBlockType;       ks, NumBytesBlock:integer; Buffer:ANYPTR); procedure ScsiTapeWrite( pSB:PtrSessionBlockType; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); procedure ScsiDiscRead( pSB:PtrSessionBlockType;  op_code : byte; lunit : 0..7; pad0 : 0..15; reladr : boolean; block_n : integer; case integer of 1:(pad1 : integer); 2:(pad2 : shortint; v0 : 0..3; pad3 : 0..31; pmi : boolean;  BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); procedure ScsiDiscWrite( pSB:PtrSessionBlockType; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); procedure ScsiDiscFormat( pSB:PtrSessionBl v1 : 0..3; pad4 : 0..15; flag : boolean; link : boolean); end; read_capacity_data_type = packed record block_n : integer; capacity: integer; end; const read_capacity_cmd_const = read_capaci pCmd:ANYPTR; lCmd:integer; pDIn:ANYPTR; lDIn:integer; DMAIn:boolean; pDOut:ANYPTR; lDOut:integer; DMAOut:boolean ):integer; function ScsiSessionComplete(pSB:PtrSessionBlockType):BOOLEAN; function ScsiCheckError(pSB:PtrSessiockType; InterLeave:s_short); procedure ScsiDiscPrevent( pSB:PtrSessionBlockType); procedure ScsiDiscAllow( pSB:PtrSessionBlockType); implement const DEBUG = FALSE; TDEBUG = FALSE; type MiscTemplate = packed record MiscpScBlock:ANYPonBlockType):integer; procedure ScsiSessionSense( SelectCode:S_TYPE_ISC; pBuf:ANYPTR; var Length:integer); procedure ScsiSessionAbort(pSB:PtrSessionBlockType); procedure ScsiReset( SelectCode:S_TYPE_ISC); procedure ScsiModeSelectTR; MiscpSenseSpace:PtrChar; MiscSenseLength:integer; end; PtrMiscTemplateType = ^MiscTemplate; type test_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..31; pad1 : shortint; pad2 : by(pSB:PtrSessionBlockType; pDB : PtrModeSelectDataType; sector_size : integer); procedure ScsiModeSense(pSB:PtrSessionBlockType; pDB : PtrModeSenseDataType ; var sector_size : integer); procedure ConfigureMcBeth(pSB : PtrSessionBlockTyte; pad3 : byte; end; const test_cmd_const = test_cmd_type[ op_code:hex('00'), lunit:0, pad0:0, pad1:0, pad2:0, pad3:0]; type inq_string = string255; inquiry_cmd_type = packed record pe); function SyncMcBeth(pSB : PtrSessionBlockType): integer; procedure TapeName( uep : uep_type; var i : string80) ; procedure ScsiTapeUnload(pDAV : PtrDeviceAddressVectorsType); procedure SyncTeac(pSB : PtrSessionBlockType); procedure ScsiCheck op_code : byte; lunit : 0..7; pad0 : 0..31; pad1 : shortint; reqlen : byte; pad2 : byte; end; inquiry_data_type = packed record case integer of 1:(device_code : shortint); 2:(deviceDev( pSB:PtrSessionBlockType); procedure ScsiDevInfo( pSB:PtrSessionBlockType; var DevType, AnsiVersion:integer; var Removable:boolean; var VendorString:string255); procedure ScsiDiscSize( pSB:PtrSessionBlockType; var NumBy_type : byte; rmb : boolean; qualifier : 0..127; iso_version : 0..3; ecma_version: 0..7; ansi_version: 0..7; pad1 : byte; vendor : inq_string); 3:(inqjunk tesBlock, NumBlocksTrack, NumTracksCylinder, NumCylinders:integer); procedure ScsiDiscBlocks( pSB:PtrSessionBlockType; var NumBytesBlock, TotBlocks:integer); procedure ScsiTapeRead( pSB:PtrSessionBlockType; BlockStart, NumBloc : integer; vendlen : byte); end; const inquiry_cmd_const = inquiry_cmd_type[ op_code:hex('12'), lunit:0, pad0:0, pad1:0, reqlen:255, pad2:0]; type read_capacity_cmd_type = packed record       ty_cmd_type[ op_code:hex('25'), lunit:0, pad0:0, reladr:false, block_n:0, pad1:0]; type mode_sense_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..31; pcf : 0..3; lmsb : 0, llsb : 0, v0 : 0, pad5 : 0, flag : FALSE, link : FALSE]; type write_cmd_type = read_cmd_type; const write_cmd_const = write_cmd_type[ op_code : hex('2a'), lunit:0,  pg_code : 0..hex('3f'); pad1 : byte; reqlen : byte; pad2 : byte; end; mode_sense_data_type = packed record ms_len : byte; medtype : byte; wp : boolean; rsvd1 : 0 .. 127; bd_len pad0:0, reladr:false, block_n:0, pad4 : 0, lmsb : 0, llsb : 0, v0 : 0, pad5 : 0, flag : FALSE, link : FALSE]; {pad1:0, n_blocks:0, pad2:0];} type re : byte; ms_data : packed array [ 0 .. 255 ] of char; end; block_descript_type = packed record d_code : byte; nb_msb : byte; nb_2 : byte; nb_lsb : byte; rsvd1 : byte; bl_msb : byte; bl_2 quest_sense_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..31; pad1 : shortint; len : byte; case integer of 1:(byte5 : byte); 2:(v0 : 0..3; pad2 : 0..15; flag : bool : byte; bl_lsb : byte; end; page_header_type = packed record r1 : boolean; r2 : boolean; PageCode: 0 .. 63; PageLen : byte; end; pPageType = ^page_header_type; const mode_sense_cmd_const = mean; link : boolean); end; pac18 = packed array [1..18] of byte; request_sense_data_type = packed record case integer of 1:(sensedata:packed array[1..255] of char); 2:(advalid : boolean; e_class : 0ode_sense_cmd_type[ op_code : hex('1a'), lunit : 0, pad0 : 0, pcf : 0, pg_code : hex('3f'), pad1 : 0, reqlen : 255, pad2 : 0]; mode_select_cmd_const = mode_select_cmd_type[ op_c..7; e_code : 0..15; case integer of 1:(seg_num : byte; filemark: boolean; eom : boolean; ili : boolean; pad0 : boolean; sensekey: 0..15; byte3 : byte; more : pac18;); ode : hex('15'), lunit : 0, pf : 0, rsvd1 : 0, sp : 0, rsvd2 : 0, rsvd3 : 0, reqlen : HEX('0C'), pad2 : 0]; type read_cmd_type = packed record op_code : byte; lunit : 0..72:(block_n : 0..16777215)); end; ptr_request_sense_data_type = ^request_sense_data_type; SenseType = (sNoSense, sRecoveredError, sNotReady, sMediumError, sHardwareError, sIllegalRequest, sUnitAttention, sDataProtect, sBlankChe; pad0 : 0..15; reladr : boolean; block_n : integer; {case integer of 1:(pad1 : integer); 2:(pad2 : byte; n_blocks: shortint; pad3 : byte); 3:(}pad4 : byte; lmsb : byte; llsb : byte; v0 ck, sVendor, sCopyAbort, sCommandAbort, sEqual, sVolumeOverflow, sMisCompare, sReserved, DriverError, IllegalStatus, GetSenseFailed); const request_sense_cmd_const = request_sense_cmd_type[ op_code:hex('03'), lunit:0,  : 0..3; pad5 : 0..15; flag : boolean; link : boolean; end; const read_cmd_const = read_cmd_type[ op_code : hex('28'), lunit:0, pad0:0, reladr:false, block_n:0, pad4 : 0,  pad0:0, pad1:0, len:sizeof(request_sense_data_type), byte5:0]; type format_cmd_type = packed record op_code : byte; lunit : 0..7; fmtdata : boolean; cmplst : boolean; dlf : 0..7; v0       integer of 1:(b:byte;); 2:(r:boolean; v1:0..3; stat:0..15; v2:boolean;); end; type read_tape_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..7; sili : 0..1; fixed : 0. pad2 : shortint; first : integer; last : integer; pad3 : byte; blocks_in_buff1 : byte; blocks_in_buff2 : byte; blocks_in_buff3 : byte; bytes_in_buff1 : byte; bytes_in_buff2 : byte; bytes_i.1; xferlen1 : s_byte; xferlen2 : s_byte; xferlen3 : s_byte; pad2 : 0..63; flag : 0..1; link : 0..1; end; const read_tape_cmd_const = read_tape_cmd_type[ op_code : hex('08'), lunit:0, pad0:0, sili:0,n_buff3 : byte; bytes_in_buff4 : byte; end; const read_tape_position_const = read_tape_position[ op_code : hex('34'), lunit:0, pad0:0, bt : 1, pad1 : 0, pad2 : 0, pad3 : 0, pad4 : 0,  : byte; il_msb : byte; il_lsb : byte; v1 : 0..3; rsvd : 0..15; flag : boolean; link : boolean; end; defect_header_type = packed record rsvd1 : byte; fov : boolean; dpry  fixed:1, xferlen1:0, xferlen2:0, xferlen3:0, pad2:0, flag:0, link:0]; type write_tape_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..15; fixed : 0..1; xferlen1 : s_byt : boolean; dcrt : boolean; stpf : boolean; rsvd2 : 0 .. 7; v0 : boolean; lmsb : byte; llsb : byte; end; const format_cmd_const = format_cmd_type[ op_code:hex('04'), lunit:0, e; xferlen2 : s_byte; xferlen3 : s_byte; pad2 : 0..63; flag : 0..1; link : 0..1; end; const write_tape_cmd_const = write_tape_cmd_type[ op_code : hex('0A'), lunit:0, pad0:0, fixed:1, xferlen1:0,  fmtdata:false, cmplst:false, dlf:0, v0:0, il_msb:0, il_lsb:0, v1:0, rsvd:0, flag:false, link:false]; defect_header_const = defect_header_type[ rsvd1:0, fov:false, dpry:false, xferlen2:0, xferlen3:0, pad2:0, flag:0, link:0]; type rewind_tape_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..15; immed : 0..1; pad1 : byte; pad2 : byte; pad3 : by dcrt:false, stpf:false, rsvd2:0, v0:false, lmsb:0, llsb:0]; type prevent_allow_cmd_type = packed record op_code : byte; lunit : 0..7; pad0 : 0..31; pad1 : shortint; pad2 :te; pad4 : 0..63; flag : 0..1; link : 0..1; end; const rewind_tape_cmd_const = rewind_tape_cmd_type[ op_code : hex('01'), lunit : 0, pad0 : 0, immed : 1, pad1 : 0, pad2 : 0, pad3 : 0, pad4 : 0, 0..hex('7f'); prevent : boolean; pad3 : byte; end; const prevent_cmd_const = prevent_allow_cmd_type[ op_code : hex('1e'), lunit : 0, pad0 : 0, pad1 : 0, pad2 : 0, prevent : true, p flag : 0, link : 0]; type read_tape_position = packed record op_code : byte; lunit : 0..7; pad0 : 0..15; bt : 0..1; pad1 : byte; pad2 : byte; pad3 : byte; pad4 : byte; pad5 : byte; pad6 ad3 : 0]; allow_cmd_const = prevent_allow_cmd_type[ op_code : hex('1e'), lunit : 0, pad0 : 0, pad1 : 0, pad2 : 0, prevent : false, pad3 : 0]; type status_type = packed record case  : byte; pad7 : byte; pad8 : 0..63; flag : 0..1; link : 0..1; end; tape_position_data_type = packed record bop : 0..1; eop : 0..1; pad0 : 0..7; bpu : 0..1; pad1 : 0..3; partition : byte;        pad5 : 0, pad6 : 0, pad7 : 0, pad8 : 0, flag:0, link:0]; type unload_tape_cmd = packed record op_code : byte; lunit : 0..7; pad0 : 0..15; immed : 0..1; pad1 : byte; pad2 : byte; pad3 :areError} zbadmode, {sIllegalRequest} zmediumchanged, {sUnitAttention} zprotected, {sDataProtect} znoblock, {sBlankCheck} zcatchall, {sVendor} zcatchall, {sCopyAbort}  byte; pad4 : byte; end; const unload_tape_cmd_const = unload_tape_cmd[ op_code : hex('1B'), lunit : 0, pad0 : 0, immed : 0, pad1 : 0, pad2 : 0, pad3 : 0, pad4 : 0]; allow_tape_cmd_const = unl znodevice, {sCommandAbort - only sense with this translation} zcatchall, {sEqual} znosuchblk, {sVolumeOverflow} zcatchall, {sMisCompare} zcatchall, {sReserved} zbadmode, oad_tape_cmd[ op_code : hex('1E'), lunit : 0, pad0 : 0, immed : 0, pad1 : 0, pad2 : 0, pad3 : 0, pad4 : 0]; { NOTE - locate and space are not the same thing } type locate_tape_cmd = packed record op_code :  {DriverError} zcatchall, {IllegalStatus} zcatchall]; {GetSenseFailed} InternalXlateConst = InternalXlateType[ inoerror, {NoIntErr} zcatchall, {ScsiStackingErr} zcatchall, {Rbyte; lunit_etc : byte; pad1 : byte; baddr : integer; pad2 : byte; partition : byte; last : byte; end; const locate_tape_cmd_const = locate_tape_cmd[ op_code : hex('2B'), lunit_etc : 4, pad1 : 0, baddr : 0, unlevelErr} zcatchall, {StateMachineErr} zstrangei, {ScsiInteruptErr} znodevice, {ScsiAddressErr} znodevice, {SelectRetryErr} zbadhardware, {ScsiManXferErr} zbadhardware, { pad2 : 0, partition : 0, last : 0]; type read_block_limits_cmd = packed record op_code : byte; lunit : 0..7; pad0 : 0..31; pad1 : byte; pad2 : byte; pad3 : byte; pad4 : 0..63; flag : 0..1; link : 0..ScsiXferErr} ztimeout, {XferRetryErr} zcatchall, {ScsiEscapeErr} zcatchall, {ScsiPhaseErr} zcatchall, {ScsiCatastrophicErr} zcatchall, {ScsiBadMsg} ztimeout, {ScsiT1; end; read_block_limits_data = packed record pad0 : byte; max_length1 : byte; max_length2 : byte; max_length3 : byte; min_length : s_short; end; const read_block_limits_const = read_block_limits_cmd[ op_code :imeOutErr} zbadmode, {ScsiXferParmErr} zcatchall]; {ScsiMiscErr} $IF TDEBUG$ procedure dump_trace(var sb:SessionBlockType); label 1; TYPE EventType = ( { NOTE: The following event list must match the assemble hex('05'), lunit : 0, pad0 : 0, pad1 : 0, pad2 : 0, pad3 : 0, pad4 : 0, flag : 0, link : 0]; type SenseXlateType = packed array [ SenseType ] of iorsltwd; InternalXlateType = packed array [ InternalErrTypr event list defined in ST_EQU } {Standard events} NoEvent, ScsiErr, WaitForISR, {Bus Phase Events, returned by hwiGetPhase} BusFree, BusBusy, MsgIn, MsgOut, CmdPhase, DataPhase, StatusPhase, {Message In Events} Synch, SaveDataPe ] of iorsltwd; const SenseXlateConst = SenseXlateType[ inoerror, {sNoSense} inoerror, {sRecoveredError} znotready, {sNotReady} zbadblock, {sMediumError} zbadhardware, {sHardwtr, RestorePtrs, Disconnect, CmdComplete, Reject, Identify, LCC, LCCwFlag, {Establish Path} NeedSynchParms, {Do a Transfer} OriginalPhase ); TRICKYDICKY = RECORD CASE BOOLEAN OF TRUE:(S:ST_SHORT); FALSE:(B1:CHAR;B2:CHAR;E:EVE      ne : boolean; i : integer; temp : state_name_string; begin temp := ''; strwrite(temp,1,i,value:1); stateforoffset := temp; i := 1; done := false; if nametable<>nil then repeat with nametable^[i] do ber; pChar1, pChar2:PtrChar; begin pChar1 := pSB; pChar2 := addr(pChar1^, 1); pChar1^ := #0; moveleft(pChar1^, pChar2^, sizeof(SessionBlockType)-1); with PtrSessionBlockType(pSB)^, PtrDeviceAddressVectorsType(pDAV)^ do begin SelectCode := sc; Devigin if offset=value then begin done:= true; stateforoffset := name; end else if offset=0 then done := true else i := i + 1; end; until done; end; { stateforoffset} begin { dump_trace } {REWRITE(ce := ba; LUN := du; SUN := dv; Overlap := false; DoNotDisconnect := true; DoTrace := false; end; end; function RequestSense(pSB:PtrSessionBlockType):SenseType; var SB:SessionBlockType; {save the user's session block}NTTYPE); END; var control: control_ptr; i : integer; nametable : trace_name_table_ptr; symbolname: string255; T:TRICKYDICKY; EVENT:EVENTTYPE; function value(symbol: string255): integer; var modp: moddescptr; LISTING,'#6:');} if not sb.DoTrace then goto 1; control := sb.tracestuff; nametable := nil; with control^, sb do begin i := ttotal; repeat while(i = tremaining) and (sessionstate <> sessioncomplete) do ; with tdata^[i] do c ptr, valueptr: addrec; found: boolean; begin {value} value := 0; found := false; modp := sysdefs; while (modp<>nil) and not found do with modp^ do begin ptr := defaddr; while (ptr.anil) and not found do with modp^ do begin ptr := defaddr; while (ptr.a NIL then GetpMisc := pMisc; end; end; end; procedure ScsiSBSize(var size:integer); begin size := sizeof(SessionBlockType); end; procedure ScsiSBInit(pSB:ANYPTR; pDAV:ANYPTR); var i:intege       rscmd:request_sense_cmd_type; prsdata:ptr_request_sense_data_type; i:integer; begin RequestSense := GetSenseFailed; SB := pSB^; with SB do begin rscmd := request_sense_cmd_const; rscmd.lunit := LUN; Overlap := FALSE; DoNotDisconnect := TRU(inoerror); recover begin if NOT OkToCall then begin SessionState := SessionComplete; InternalStatus := ScsiAddressErr; if not Overlap then ScsiHandleSession := ScsiCheckError(pSB) else ScsiHandleSession := ord(inoerror); end E; with GetpMisc(SelectCode)^ do begin prsdata := ANYPTR(MiscpSenseSpace); i := ScsiHandleSession(addr(SB), addr(rscmd), sizeof(rscmd), prsdata, 255, false, Nil, 0, false); if i = ord(inoerror) then begin Miscelse escape(escapecode); end; end; end; function ScsiSessionComplete(pSB:PtrSessionBlockType):BOOLEAN; begin ScsiSessionComplete := (pSB^.SessionState = SessionComplete); end; function ScsiCheckError( pSB:PtrSessionBlockType):integer; var statusSenseLength := 255 - ResidualCount; with prsdata^ do begin if (e_class = 7) and (e_code = 0) then RequestSense := SenseType(sensekey); end; end; end; end; end; function ScsiHandleSession(pSB:PtrSessionBlockType; pCmd:ANYPTR:status_type; sense:SenseType; $IF DEBUG OR TDEBUG$ C:CHAR; $END$ begin with pSB^ do begin $IF DEBUG OR TDEBUG$ C := CHARPTR(CmdPtr)^; $END$ if SessionState <> SessionComplete then ScsiCheckError := ord(inoerror) else if InternalStatus; lCmd:integer; pDIn:ANYPTR; lDIn:integer; DMAIn:Boolean; pDOut:ANYPTR; lDOut:integer; DMAOut:Boolean):integer; label 1; var OkToCall:BOOLEAN; AbortCommandRetry:integer; i:integer; $IF DEBUG$ C:CHAR; $END$ begin with pSB^ do begin try Abo <> NoIntErr then begin $IF DEBUG$ WRITELN('DRIVER ERROR: ', INTERNALSTATUS); WRITELN('SCSI COMMAND IS: ',ord(c):1); {} $END$ $IF TDEBUG$ if (ord(charptr(CmdPtr)^) <> 0) then begin writeln(listing); writeln(listing, '--rtCommandRetry := 0; 1: CmdPtr := pCmd; CmdLen := lCmd; with BufIn do begin BufPtr := pDIn; BufLen := lDIn; DoDma := DMAIn; end; with BufOut do begin BufPtr := pDOut; BufLen := lDOut; DoDma := DMAOut; end; InternalSt--------------------------------------'); writeln(listing, 'TRACE FOR SCSI COMMAND: ',ord(c):1); writeln(listing, '----------------------------------------'); dump_trace(pSB^); end; $END$ ScsiCheckError := Ord(InternalXlateConst[Internatus := NoIntErr ; SessionStatus := 0; ResidualCount := 0; { $IF DEBUG$ { C := CHARPTR(PCMD)^; { WRITELN; WRITELN('SCSI COMMAND IS: ',ord(c):1); { $END$ {} OkToCall := (GetpMisc(SelectCode) <> Nil); if not OkToCall then alStatus]); end else if SessionStatus <> 0 then begin $IF DEBUG$ WRITELN('BAD SESSION STATUS: ', SessionStatus:1); WRITELN('SCSI COMMAND IS: ',ord(c):1); {} $END$ status.b := SessionStatus; if (status.stat <> 0) then begin  escape(0); call(isc_table[SelectCode].io_drv_ptr^.iod_tfr, nil, pSB); if not Overlap then begin i := ScsiCheckError(pSB); if (i = ord(znodevice)) and ((InternalStatus = NoIntErr)) then begin {sense was sCommandAbort} if AbortComma if (status.stat = 1) then begin if CharPtr(CmdPtr)^ <> #3 {request_sense} then begin $IF DEBUG$ writeln('Calling Request Sense.'); $END$ sense := RequestSense(pSB); end else begin $IF DEBUG$ ndRetry < 1 then begin $IF DEBUG$ WRITELN('Retrying because of aborted command.'); $END$ AbortCommandRetry := AbortCommandRetry + 1; goto 1; end; end; ScsiHandleSession := i; end else ScsiHandleSession := ord writeln('Request Sense Failed!.'); $END$ sense := GetSenseFailed; end; end else if (status.stat = 4) then begin $IF DEBUG$ writeln('Sense is sNotReady.'); $END$ sense := sNotReady end else        NIL, 0, false, nil, 0, false); if iotemp <> 0 then { allow one retry } iotemp := ScsiHandleSession(pSB, addr(ltpcmd), sizeof(ltpcmd), NIL, 0, false, nil, 0, false); ChangeTapePosition := iotemp; end; {===============================================================================} procedure ScsiTapeRead( pSB:PtrSessionBlockType; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); label 100; var rtcmd:read_tape_cmd_type; tries,remaining :integer; c=========================================================} procedure ScsiTapeUnload(pDAV : PtrDeviceAddressVectorsType); var SB : SessionBlockType; pSB : PtrSessionBlockType; utcmd : unload_tape_cmd; iotemp, saveior : integer; begin saveior := iorurrent_location : integer; iotemp : integer; begin iotemp := 0; if NumBlocks > 0 then begin { Make sure the tape is in the correct spot before reading ... } iotemp := ReadTapePosition(pSB,current_location); if iotemp <> 0 the begin $IF DEBUG$ writeln('Illegal status.'); $END$ sense := IllegalStatus; end; $IF DEBUG$ WRITELN('BAD SESSION SENSE: ', SENSE); WRITELN('SCSI COMMAND IS: ',ord(c):1); {} $END$ ScsiCheckError := ordesult; pSB := addr(SB); ScsiSBInit(pSB,pDAV); { Allow it to be unloaded : } utcmd := allow_tape_cmd_const; iotemp := ScsiHandleSession(pSB, addr(utcmd), sizeof(utcmd), NIL, 0, false, NIL, 0, false ); if iotemp <> 0 t(SenseXlateConst[sense]); end else {Good Status} ScsiCheckError := ord(inoerror); end else {Good Status} ScsiCheckError := ord(inoerror); end; end; procedure ScsiSessionSense( SelectCode:S_TYPE_ISC; pBuf:ANYPTR; var Length:inthen { try once more } iotemp := ScsiHandleSession(pSB, addr(utcmd), sizeof(utcmd), NIL, 0, false, NIL, 0, false ); { .. Then, unload it : } utcmd := unload_tape_cmd_const; utcmd.immed := 1; iotemp := ScsiHandleSession(eger); var pMisc:PtrMiscTemplateType; begin pMisc := GetpMisc(SelectCode); if pMisc <> Nil then with pMisc^ do begin if Length > MiscSenseLength then Length := MiscSenseLength; moveleft(MiscpSenseSpace^, PtrChar(pBuf)^, Length); end else LepSB, addr(utcmd), sizeof(utcmd), NIL, 0, false, NIL, 0, false ); if iotemp <> 0 then { try once more } iotemp := ScsiHandleSession(pSB, addr(utcmd), sizeof(utcmd), NIL, 0, false, NIL, 0, false ); ioresngth := 0; end; procedure ScsiSessionAbort(pSB:PtrSessionBlockType); begin with pSB^ do begin if (Overlap) and (SessionState = SessionRunning) then call(isc_table[SelectCode].io_drv_ptr^.iod_tfr, ANYPTR(1), pSB); end; end; procedure ScsiReset( ult := saveior; end; {=======================================================================} function ReadTapePosition(pSB:PtrSessionBlockType; var where : integer) : integer; var rtpcmd : read_tape_position; rtpdata : tape_position_data_type; SelectCode:S_TYPE_ISC); var i:integer; begin i := SelectCode; call(isc_table[SelectCode].io_drv_ptr^.iod_tfr, ANYPTR(2), ANYPTR(i)); end; {======================================================================} function ChangeTapePosition(pSB:PtrS iotemp : integer; begin rtpcmd := read_tape_position_const; iotemp := 0; iotemp := ScsiHandleSession(pSB, addr(rtpcmd), sizeof(rtpcmd), addr(rtpdata), sizeof(rtpdata), false, NIL, 0, false ); if iotemp <> 0 then { one retry essionBlockType; newpos : integer) : integer; var ltpcmd : locate_tape_cmd; iotemp : integer; begin ltpcmd := locate_tape_cmd_const; ltpcmd.baddr := newpos; iotemp := 0; iotemp := ScsiHandleSession(pSB, addr(ltpcmd), sizeof(ltpcmd),} iotemp := ScsiHandleSession(pSB, addr(rtpcmd), sizeof(rtpcmd), addr(rtpdata), sizeof(rtpdata), false, NIL, 0, false ); if iotemp = 0 then where := rtpdata.first else where := -1; ReadTapePosition := iotemp; end; {====      n begin ioresult := iotemp; goto 100; end; if current_location <> BlockStart then iotemp := ChangeTapePosition(pSB, BlockStart ); if iotemp <> 0 then begin ioresult := iotemp; goto 100; end; end; { Set up the command correctly .. NumBlocks*NumBytesBlock, true); until (ioresult <> ord(zbadblock)) or (tries >= 2); end; 100: { status = 2 and sense = sNoSense means we are near the } { end of the tape. } { if pSB^.SessionStatus = 2 then begin writel. } rtcmd := read_tape_cmd_const; rtcmd.xferlen1 := NumBlocks DIV 65536; remaining := NumBlocks MOD 65536; rtcmd.xferlen2 := remaining DIV 256; rtcmd.xferlen3 := remaining MOD 256; with pSB^ do if Overlap then ioresultn('near the end, ioresult is set to 1 ...'); ioresult := 1; end; } end; {======================================================================} procedure ScsiModeSense(pSB:PtrSessionBlockType; pDB : PtrModeSenseDataType ; var sector_size := ord(zbadmode) else begin tries := 0; repeat tries := tries + 1; ioresult := ScsiHandleSession(pSB, addr(rtcmd), sizeof(rtcmd), Buffer, NumBlocks*NumBytesBlock, true, Nil, 0, false); until (ioresult <>  : integer); type tricky_as_hell = record case boolean of FALSE: (i : integer); TRUE: (c1,c2,c3,c4 : char); end; var mscmd : mode_sense_cmd_type; msdata : mode_sense_data_type; iotemp : integer; grab_it : tricky_as_hell;ord(zbadblock)) or (tries >= 2); end; 100: end; {======================================================================} procedure ScsiTapeWrite(pSB:PtrSessionBlockType; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); label 100; var  { Makes a call to ScsiHandleSession to query the controller } begin grab_it.i := 0; mscmd := mode_sense_cmd_const; mscmd.lunit := pSB^.LUN; iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), pDB, { addr(msdata),} size wtcmd:write_tape_cmd_type; current_location : integer; tries,iotemp,remaining : integer; wrsense : SenseType; addlsense : integer; begin iotemp := 0; if NumBlocks > 0 then begin { Make sure the tape is in the correct spot befoof(msdata), false, nil, 0, false); if iotemp <> 0 then { allow one retry } iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), pDB, { addr(msdata),} sizeof(msdata), false, nil, 0, false); if iotemp = 0 re writing ... } iotemp := ReadTapePosition(pSB,current_location); if iotemp <> 0 then begin ioresult := iotemp; goto 100; end; if current_location <> BlockStart then iotemp := ChangeTapePosition(pSB, BlockStart ); if iotemp <> 0 then begin then begin grab_it.c2 := pDB^.ms_data[5]; grab_it.c3 := pDB^.ms_data[6]; grab_it.c4 := pDB^.ms_data[7]; sector_size := grab_it.i; end else sector_size := 666; { sector from HELL !!!! } end; {===============================ioresult := iotemp; goto 100; end; end; wtcmd := write_tape_cmd_const; wtcmd.xferlen1 := NumBlocks DIV 65536; remaining := NumBlocks MOD 65536; wtcmd.xferlen2 := remaining DIV 256; wtcmd.xferlen3 := remaining MOD 2=======================================} procedure InitModeSense(pSB:PtrSessionBlockType; pDB : PtrModeSenseDataType ; var sector_size : integer); type tricky_as_hell = record case boolean of FALSE: (i : integer); TRUE: (c1,c2,c3,c4 56; with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin tries := 0; repeat tries := tries + 1; ioresult := ScsiHandleSession(pSB, addr(wtcmd), sizeof(wtcmd), Nil, 0, false, Buffer, : char); end; var mscmd : mode_sense_cmd_type; msdata : mode_sense_data_type; iotemp : integer; grab_it : tricky_as_hell; my_ptr : ^mode_sense_data_type; { Makes a call to ScsiHandleSession to query the controller } begin grab_i      := chr(cylinders); { 77 or 80 cylinders } cram_it.i := sector_size; pDB^.ms_data[6] := cram_it.c3; pDB^.ms_data[7] := cram_it.c4; pDB^.ms_len := 0; pDB^.wp := false; pDB^.rsvd1 := 0; pDB^.medtype := 0; pDB^.bd_lenscmd), sizeof(mscmd), { addr(msdata)} nil, 0, {sizeof(msdata), } false, pDB, 12 {sizeof(msdata)} , false); if iotemp <> 0 then ioresult := iotemp; { ?????????? } end; {======================================================= := 0; mscmd.lunit := pSB^.LUN; mscmd.reqlen := 36; iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), { addr(msdata)} nil, 0, {sizeof(msdata), } false, pDB, 36 {sizeof(msdata)} , false); ===================} procedure ScsiDiscReadOnce( pSB:PtrSessionBlockType; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); var rcmd:read_cmd_type; tries:integer; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) elset.i := 0; mscmd := mode_sense_cmd_const; mscmd.lunit := pSB^.LUN; iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), pDB, { addr(msdata),} sizeof(msdata), false, nil, 0, false); if iotemp <> 0 then { allow one  IF IOTEMP <> 0 THEN { allow one re-try } iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), { addr(msdata)} nil, 0, {sizeof(msdata), } false, pDB, 36 {sizeof(msdata)} , false); if iotemp <> 0 then ioreretry } iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), pDB, { addr(msdata),} sizeof(msdata), false, nil, 0, false); if iotemp = 0 then begin my_ptr := anyptr(pDB); grab_it.c2 := my_ptr^.ms_data[5sult := iotemp; { ?????????? } end; {==========================================================================} {======================================================================} procedure ScsiModeSelect(pSB:PtrSessionBlockType; pDB : PtrModeS]; grab_it.c3 := my_ptr^.ms_data[6]; grab_it.c4 := my_ptr^.ms_data[7]; sector_size := grab_it.i; end else sector_size := 666; { sector from HELL !!!! } if iotemp <> 0 then ioresult := iotemp; { ?????????? } end; {==========electDataType; sector_size : integer); type tricky_as_hell = record case boolean of FALSE: (i : integer); TRUE: (c1,c2,c3,c4 : char); end; var mscmd : mode_select_cmd_type; msdata : mode_select_data_type; iotemp : integer;============================================================} procedure InitModeSelect(pSB:PtrSessionBlockType; pDB : PtrModeSelectDataType; sector_size : integer; cylinders : integer); type tricky_as_hell = record case boolean of FA cram_it : tricky_as_hell; brute_force : packed array [0..255] of char; begin mscmd := mode_select_cmd_const; cram_it.i := sector_size; pDB^.ms_data[5] := cram_it.c2; pDB^.ms_data[6] := cram_it.c3; pDB^.ms_data[7] := cramLSE: (i : integer); TRUE: (c1,c2,c3,c4 : char); end; var mscmd : mode_select_cmd_type; msdata : mode_select_data_type; iotemp : integer; cram_it : tricky_as_hell; brute_force : packed array [0..255] of char; counter : inte_it.c4; pDB^.ms_data[1] := chr(0); pDB^.ms_data[2] := chr(0); pDB^.ms_data[3] := chr(0); pDB^.ms_len := 0; pDB^.wp := false; pDB^.rsvd1 := 0; pDB^.medtype := 0; mscmd.lunit := pSB^.LUN; iotemp := ScsiHandleSeger; begin for counter := 0 to 31 do pDB^.ms_data[counter] := pDB^.ms_data[counter+16]; { shift down } mscmd := mode_select_cmd_const; pDB^.ms_data[0] := chr(5); { JAB said so } pDB^.ms_data[8] := chr(0); pDB^.ms_data[9] ssion(pSB, addr(mscmd), sizeof(mscmd), { addr(msdata)} nil, 0, {sizeof(msdata), } false, pDB, 12 {sizeof(msdata)} , false); IF IOTEMP <> 0 THEN { allow one re-try } iotemp := ScsiHandleSession(pSB, addr(m      begin tries := 1; repeat tries := tries + 1; rcmd := read_cmd_const; rcmd.lunit := LUN; rcmd.block_n := BlockStart; rcmd.lmsb := NumBlocks div Hex('100'); rcmd.llsb := NumBlocks mod Hex('100'); ioresult := ScsiHandl, false, NIL, 0, false ); if iotemp <> 0 then { try once more } iotemp := ScsiHandleSession(pSB, addr(utcmd), sizeof(utcmd), NIL, 0, false, NIL, 0, false ); if iotemp = 0 then goto 100; SyncMcBeth := 1; { mediaeSession(pSB, addr(rcmd), sizeof(rcmd), Buffer, NumBlocks*NumBytesBlock, true, Nil, 0, false); until (ioresult <> ord(zbadblock)) or (tries >= 2); end; end; {================================================================= not present in drive } 100: ioresult := saveior; end; {================================================================} { called from CTABLE. set McBeth parameters for use with the PaWS } { BACKUP utility. JWH 6/93 } procedure ConfigureMcBeth(pSB : P} procedure McBethSelect(pSB:PtrSessionBlockType; pDB : PtrModeSelectDataType; var success : integer); type tricky_as_hell = record case boolean of FALSE: (i : integer); TRUE: (c1,c2,c3,c4 : char); end; var mscmd : mode_select_ctrSessionBlockType); var data_block : mode_sense_data_type; iotemp, saveior, errval : integer; begin saveior := ioresult; ioresult := 0; { Get the current configuration from the drive : } ScsiModeSense(pSB,ADDR(data_block),errval); { md_type; msdata : mode_select_data_type; iotemp : integer; cram_it : tricky_as_hell; brute_force : packed array [0..255] of char; begin mscmd := mode_select_cmd_const; mscmd.reqlen := 28; mscmd.pf := 1; iotemp := ScAdjust the size of fixed blocks to 65536 bytes : } data_block.ms_len := 0; { a requirement } data_block.ms_data[5] := chr(1); { set fixed block size to 64k } data_block.ms_data[6] := chr(0); { set fixed block size to 64k } data_block.ms_data[7] := siHandleSession(pSB, addr(mscmd), sizeof(mscmd), { addr(msdata)} nil, 0, {sizeof(msdata), } false, pDB, 28 {sizeof(msdata)} , false); IF IOTEMP <> 0 THEN { allow one re-try } iotemp := ScsiHandleSession(pSB, chr(0); { set fixed block size to 64k } { Set it to what you want : } McBethSelect(pSB,ADDR(data_block),errval); ioresult := saveior; { RESTORE PREVIOUS IORESULT } end; {================================================================} procedure Ta addr(mscmd), sizeof(mscmd), { addr(msdata)} nil, 0, {sizeof(msdata), } false, pDB, 28 {sizeof(msdata)} , false); if iotemp <> 0 then ioresult := iotemp; { ?????????? } success := iotemp; end; {==================peName ( uep : uep_type; var i : string80 ) ; var SB : SessionBlockType; pSB : PtrSessionBlockType; DAV : DeviceAddressVectorsType; pDAV : PtrDeviceAddressVectorsType; iotemp, saveior, devtype, ver : integer; moveable : boolean; vstring==============================================} { If valid media in the drive return 0 else return 1 } function SyncMcBeth(pSB : PtrSessionBlockType) : integer; label 100; var fake_buffer : packed array[0..4095] of char; iotemp, saveior : integer; ut : string255; begin saveior := ioresult; pSB := addr(SB); pDAV := addr(DAV); DAV.sc := uep^.sc; DAV.ba := uep^.ba; DAV.du := 0; DAV.dv := 0; ScsiSBInit(pSB,pDAV); ScsiDevInfo(pSB,devtype,ver,moveable,vstring); i := vstring; iocmd : unload_tape_cmd; begin saveior := ioresult; SyncMcBeth := 0; utcmd := allow_tape_cmd_const; utcmd.op_code := hex('01'); { change it to a rewind command } iotemp := ScsiHandleSession(pSB, addr(utcmd), sizeof(utcmd), NIL, 0result := saveior; end; {================================================================} procedure SyncTeac(pSB : PtrSessionBlockType); var sense_size : integer; data_block : mode_sense_data_type; fake_buffer : packed array[0..2047] of char; {      SCSI MODE SENSE FAILURE'); } done := TRUE; { just quit } ioresult := tempior; end; save_first := sense_size; while not done do begin ioresult := 0; ScsiDiscReadOnce(pSB,0,1,sense_size,addr(real_buf)); if ioresult = 0 tSAVED_CYLINDERS := ord(data_block.ms_data[25]); { WRITELN('MODE SENSE - SENSE SIZE : ',SENSE_SIZE); writeln; writeln; writeln; writeln; WRITELN('MODE SENSE - SAVED CYLINDERS : ',saved_cylinders); } {*******************************************hen begin read_worked := TRUE; done := TRUE; { now in sync } end; if ioresult = 1 then { Read Failure } begin { vary the sector size and then try again , until we read successfully or we try all 3 possible sizes } ************************} if data_block.medtype = 136 then high_density := TRUE; {*******************************************************************} { make sure cylinders = 77 or 80 depending ... } if sense_size = 512 then begin { could be big enough for what we do } real_buf : BufferBlockType; save_first : integer; read_worked : boolean; done : boolean; cylinders_should_be : integer; test_block : integer; saved_cylinders : integer; TEMPIOR : integer; sav if sense_size = 256 then sense_size := 1024 else if sense_size = 1024 then sense_size := 512 else if sense_size = 512 then sense_size := 256 else done := TRUE; { should never happen but ... just quit } if not done then begin eior : integer; maxbytes_should_be : integer; high_density : boolean; i,j,scode,baddr,dunit : byte; begin saveior := ioresult; ioresult := 0; read_worked := FALSE; done := false; real_buf.BufPtr := addr(fake_buffer); real_buf.BufL { WRITELN('SECTOR SIZE ADJUST - CYLINDERS : ',cylinders_should_be); } ioresult := 0; { reset it first } InitModeSelect(pSB,addr(data_block),sense_size, cylinders_should_be); if ioresult <> 0 then { mode select failed - just quit } begin ten := 4; real_buf.DoDMA := FALSE; scode := pSB^.SelectCode; baddr := pSB^.Device; dunit := pSB^.LUN; high_density := FALSE; maxbytes_should_be := 0; {*********************************************************************} { Temporarily knock oempior := ioresult; { writeln('WARNING - SCSI MODE SELECT FAILURE'); } done := TRUE; ioresult := tempior; end; end; { if not done } end { if ioresult = 1 } else { if read failed with something not -1, there are other problems. ut HFS unit(s) associated with the TEAC } { Put it (them) back below - if appropriate. } if (h_unitable <> NIL) then for i := 1 to maxunit do begin with unitable^[i] do if ((sc = scode) and (baddr = ba) and (dunit = du)) then beg just fall through and do nothing } done := TRUE; { just give up } if sense_size = save_first then done := TRUE; { tried them all } if not done then ScsiModeSense(pSB,ADDR(data_block),sense_size); end; { while not done } if in with h_unitable^.tbl[i] do if is_hfsunit then begin call(h_unitable^.inval_cache_proc,i); umaxbytes := 0; end; end; end; {*********************************************************************} { Find out what the controllread_worked then { Pascal Workstation Only } begin { WRITELN('READ WORKED - ADJUSTING CYLINDER COUNT'); } {******************************************************************} for i := 1 to maxunit do begin with unitable^[i] do ifer thinks the sector size is : } ScsiModeSense(pSB,ADDR(data_block),sense_size); cylinders_should_be := ord(data_block.ms_data[25]); if sense_size = 666 then { mode sense did not work } begin tempior := ioresult; { writeln('WARNING -  ((sc = scode) and (baddr = ba) and (dunit = du)) then dvrtemp := sense_size; end; {******************************************************************} ScsiModeSense(pSB,ADDR(data_block),sense_size); if sense_size <> 666 then begin      77 or 80 ? } if data_block.medtype = 128 then { medium density } begin { WRITELN('GOT MEDIUM DENSITY <<<<<<<<<<<<<<<<'); } ioresult := 0; test_block := 1390; { in cylinder 78 } { controller has to think 80 before theln('mode sense worked at : ',sense_size); ioresult := tempior; } SAVED_CYLINDERS := ord(data_block.ms_data[25]); { if saved_cylinders <> cylinders_should_be then begin } { writeln('mode select - changing cylinders to : ',cylinderis test : } if SAVED_CYLINDERS <> 80 then InitModeSelect(pSB,ADDR(data_block),sense_size,80); ScsiDiscReadOnce(pSB,test_block,1,sense_size,addr(real_buf)); { IF IORESULT <> 0 THEN BEGIN ioresult := 0; ScsiDiscReadOnce(ps_should_be); } InitModeSelect(pSB,ADDR(data_block),sense_size, cylinders_should_be); { if ioresult <> 0 then begin tempior := ioresult; writeln('WARNING - MODE SELECT FAILURE'); ioresult := tempior; end else wriSB,test_block,1,sense_size,addr(real_buf)); END; } if ioresult <> 0 then begin { writeln('read failed from ',test_block); } cylinders_should_be := 77; end else BEGIN { writeln('read worked from ',test_blteln('MODE SELECT SUCCESSFUL TO : ',sense_size,' ',cylinders_should_be); } { end else writeln('mode select not called - cylinders : ',cylinders_should_be); } end; { WRITELN('end OF READ_WORKED'); } {************************************ock); } cylinders_should_be := 80; end; end; { medtype = 128 } if data_block.medtype = 136 then { HIGH density } begin { WRITELN('GOT HIGH DENSITY <<<<<<<<<<<<<<<<'); } ioresult := 0; test_block := 2860; { in*********************************} case sense_size of 256 : maxbytes_should_be := 630784; 1024: maxbytes_should_be := 788480; 512: if cylinders_should_be = 77 then maxbytes_should_be := 709632 else maxbytes_shou cylinder 78 } { controller has to think 80 before this test : } if SAVED_CYLINDERS <> 80 then InitModeSelect(pSB,ADDR(data_block),sense_size,80); ScsiDiscReadOnce(pSB,test_block,1,sense_size,addr(real_buf)); { IF IORESULT ld_be := 737280; otherwise begin { should never happen } maxbytes_should_be := 630784; { ????? } end; end; if high_density then maxbytes_should_be := 2*maxbytes_should_be; if (h_unitable <> NIL) then for i <> 0 THEN BEGIN ioresult := 0; ScsiDiscReadOnce(pSB,test_block,1,sense_size,addr(real_buf)); END; } if ioresult <> 0 then begin { writeln('read failed from ',test_block); } cylinders_should_be := 77; end := 1 to maxunit do begin with unitable^[i] do if ((sc = scode) and (ba = baddr) and (du = dunit)) then if h_unitable^.tbl[i].is_hfsunit then begin umaxbytes := maxbytes_should_be; call(dam,uvid,i,getvolumename); if ((ior else BEGIN { writeln('read worked from ',test_block); } cylinders_should_be := 80; end; end; { medtype = 136 } end { SENSE SIZE = 512 } ELSE { not 512 byte sectors } begin cylinders_should_be := 77; { writeln('Nesult <> ord(inoerror)) or (strlen(uvid) = 0)) then umaxbytes := 0; { knock this unit out } { update umaxbytes for any friends that this unit has } for j := 1 to i-1 do begin with unitable^[j] do if ((sc = scode) and OT 512 - setting to 77'); } end; { writeln; writeln; writeln; writeln; } ScsiModeSense(pSB,ADDR(data_block),sense_size); { tempior := ioresult; if ioresult <> 0 then writeln('MODE SENSE FAILED AT : ',sense_size) ELSE writ(ba = baddr) and (du = dunit)) then umaxbytes := maxbytes_should_be; end; for j := i+1 to maxunit do begin with unitable^[j] do if ((sc = scode) and (ba = baddr) and (du = dunit)) then umaxbytes := maxbytes_should_be;      eger; moveable : boolean; vstring : STRING255; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin tcmd := test_cmd_const; tcmd.lunit := LUN; ioresult := ScsiHandleSession(pSB, addr(tcmd), sizeof(tcmd), ta), false, nil, 0, false); if iotemp = ord(inoerror) then begin if i = 1 then begin NumBlocks := rcdata.block_n; NumBytesBlock := rcdata.capacity; TotBytes := NumBlocks*NumBytesBlock; end else begin Nu Nil, 0, false, Nil, 0, false); if ioresult = ord(zmediumchanged) then begin VSTRING := 'xxxx'; ScsiDevInfo(pSB,devtype,ver,moveable,vstring); IF ((vstring[1] = 'T') and (vstring[2] = 'E') and (vstring[3] =mBlocksTrack := rcdata.block_n + 1; end; end else begin { IF have_teac then begin writeln('IT WAS A TEAC and escaping : ',iotemp); end; } escape(-10); end; if (i = 1) then rccmd.pmi := true;  end; end; end; {*********************************************************************} end; { read worked } ioresult := saveior; { RESTORE PREVIOUS IORESULT } end; { procedure sync_teac } procedure ScsiDevInfo( pSB:PtrSessionBlock 'A') and (vstring[4] = 'C')) then syncteac(pSB) ; ioresult := ord(zmediumchanged); end; end; end; procedure ScsiDiscSize( pSB:PtrSessionBlockType; var NumBytesBlock, NumBlocksTrack, NumTracksCylinder, NumCylinders:integer)Type; var DevType, AnsiVersion:integer; var Removable:boolean; var VendorString:string255); var icmd:inquiry_cmd_type; idata:inquiry_data_type; len:integer; s1, s2:string255; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) ; var rccmd:read_capacity_cmd_type; rcdata:read_capacity_data_type; mscmd:mode_sense_cmd_type; msdata:mode_sense_data_type; i,iotemp:integer; NumBlocks, TotBytes, NumBytesTrack:integer; Page4Found:boolean; pPage:pPageType; TotLen:integer; devtyp else begin icmd := inquiry_cmd_const; icmd.lunit := LUN; ioresult := ScsiHandleSession(pSB, addr(icmd), sizeof(icmd), addr(idata), sizeof(idata), false, Nil, 0, false); end; s1 := ''; setse, ver : integer; moveable,have_teac : boolean; vstring : STRING255; begin ioresult := ord(inoerror); try with pSB^ do if Overlap then begin iotemp := ord(zbadmode); escape(-10); end else begin rccmd := read_capacity_cmd_trlen(s2, 0); if ioresult = ORD(inoerror) then begin DevType := idata.device_type; AnsiVersion := idata.ansi_version; Removable := idata.rmb; len := idata.vendlen; if len >= 3 then len := len - 3 else len := 0; if (len > 0) then beconst; rccmd.lunit := LUN; end; { get the disk capacity and the number of sectors per track. If unable to obtain the sectors per track, then use the following table: 0 - 8 Meg = 4Ksectors/track 8 - 128 Meg = 8Ksectors/track gin if len >= 8 then {get the vendor name} begin s1 := strrtrim(str(idata.vendor, 4, 8)); len := len - 8; end else len := 0; if len > 16 then len := 16; if len > 0 then {get the product number} begin s2 := strrtri 128 - 256 Meg = 16 256+ = 32 } VSTRING := 'xxxx'; have_teac := FALSE; ScsiDevInfo(pSB,devtype,ver,moveable,vstring); if strlen(vstring) >= 4 then IF ((vstring[1] = 'T') and (vstring[2] = 'Em(str(idata.vendor, 4+8, len)); len := 0; end; end; end; if strlen(s2) > 0 then VendorString := s1 + '-' + s2 else VendorString := s1; end; procedure ScsiCheckDev( pSB:PtrSessionBlockType); var tcmd:test_cmd_type; devtype, ver : int') and (vstring[3] = 'A') and (vstring[4] = 'C')) then begin have_teac := TRUE; syncteac(pSB); end; for i := 1 to 2 do begin iotemp := ScsiHandleSession(pSB, addr(rccmd), sizeof(rccmd), addr(rcdata), sizeof(rcda      end; if (NumBlocksTrack >= NumBlocks) or (NumBlocksTrack < 0) then begin { no delay block so have to fake it as per above table. } if TotBytes < 8*hex('100000') then NumBytesTrack := 4*hex('400') else if TotBytes < 128*hex('1000; while (TotLen > 0) and (pPage^.PageCode <> 4) do begin TotLen := TotLen - (pPage^.PageLen + 2); pPage := addr(pPage^, pPage^.PageLen + 2); end; if pPage^.PageCode = 4 then begin Page4Found := true; NumTracksCylinder := ord(00') then NumBytesTrack := 8*hex('400') else if TotBytes < 256*hex('100000') then NumBytesTrack := 16*hex('400') else NumBytesTrack := 32*hex('400'); {TotBytes in a sector is a power of 2, so #blocks will divide evently} NumBlocksTrcharptr(addr(pPage^,5))^); end; end; { else } end; if not Page4Found then begin if TotBytes < 64*hex('100000') then NumTracksCylinder := 2 else if TotBytes < 128*hex('100000') then NumTracksCylinder := 4 else if TotBytes ack := NumBytesTrack DIV NumBytesBlock end; { attempt to get the number of tracks per cylinder. This is actually the number of surfaces, which is the number of heads. Page 4 of the data returned from the Mode Sense command contains the < 256*hex('100000') then NumTracksCylinder := 8 else NumTracksCylinder := 16; end; if ((not have_teac) or (not Page4Found)) then NumCylinders := TotBytes Div NumBytesBlock {yields #blocks} Div NumBlocksTrack {yields #tracnumber of heads. However, this is not a required command, nor is this required information. Therefore, attempt to get the info, and if unsuccessful use the following table: 0 - 64Mbytes = 2 heads 64 - 128Mbytes = 4 heads 128 -ks} Div NumTracksCylinder; {yields #cylinders} recover if escapecode <> -10 then escape(escapecode) else ioresult := iotemp; end; procedure ScsiDiscBlocks(pSB:PtrSessionBlockType; var NumBytesBlock, TotBlocks:integer); var rccmd 256Mbytes = 8 heads 256+ = 16 heads } Page4Found := false; mscmd := mode_sense_cmd_const; mscmd.lunit := pSB^.LUN; iotemp := ScsiHandleSession(pSB, addr(mscmd), sizeof(mscmd), addr(msdata), sizeof(msdata), false, ni : read_capacity_cmd_type; rcdata : read_capacity_data_type; i:integer; devtype, ver : integer; moveable : boolean; vstring : STRING255; have_teac : boolean; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin l, 0, false); if iotemp = ord(inoerror) then begin IF have_teac then { page 5 not page 4 !!!!!! } begin TotLen := msdata.ms_len - msdata.bd_len - 3; pPage := addr(msdata.ms_data[msdata.bd_len]); while (TotLen > 0) and (pPag have_teac := FALSE; VSTRING := 'xxxx'; ScsiDevInfo(pSB,devtype,ver,moveable,vstring); if strlen(vstring) >= 4 then IF ((vstring[1] = 'T') and (vstring[2] = 'E') and (vstring[3] = 'A') and (vstring[4] = 'C')) the^.PageCode <> 5) do begin TotLen := TotLen - (pPage^.PageLen + 2); pPage := addr(pPage^, pPage^.PageLen + 2); end; if pPage^.PageCode = 5 then begin Page4Found := true; NumCylinders := ord(charptr(addr(pPage^,9))^); NumBlocen BEGIN syncteac(pSB); { writeln('SYNCED FROM ScsiDiscBlocks'); } have_teac := TRUE; END; rccmd := read_capacity_cmd_const; rccmd.lunit := LUN; ioresult := ScsiHandleSession(pSB, addr(rccmd), sksTrack := ord(charptr(addr(pPage^,5))^); NumTracksCylinder := ord(charptr(addr(pPage^,4))^); end; end else { same as before } begin TotLen := msdata.ms_len - msdata.bd_len - 3; pPage := addr(msdata.ms_data[msdata.bd_len])izeof(rccmd), addr(rcdata), sizeof(rcdata), false, Nil, 0, false); end; if ioresult = ORD(inoerror) then begin NumBytesBlock := rcdata.capacity; TotBlocks := rcdata.block_n+1; end; end; procedure ScsiDiscRead( pSB:PtrSessionBlockTy     ormat_cmd_const; fcmd.lunit := LUN; fcmd.il_msb := Interleave Div HEX('100'); fcmd.il_lsb := Interleave Mod HEX('100'); saveDoNotDisconnect := DoNotDisconnect; DoNotDisconnect := false; ioresult := ScsiHandleSession(pSB, addrthen begin IsrSessionFound := true; mask := IsrMask; end; end; i := i + 1; until (IsrSessionFound) or (i > 7); if (not IsrSessionFound) and (ints.ints = Reselected) then begin i := ord(data_regs.temp) - ord(bdid); j := (fcmd), sizeof(fcmd), nil, 0, false, nil, 0, false); DoNotDisconnect := saveDoNotDisconnect; end; end; procedure ScsiDiscPrevent( pSB:PtrSessionBlockType); var pcmd:prevent_allow_cmd_type; begin with pSB^ do if Overlap then 0; while (i <> 1) and (j < 7) do begin i := osdBitLsR(i, 1); j := j + 1; end; pSB := DeviceSessionPtrs[j]; if pSB <> nil then with pSB^, InternalBlock do begin if (SessionState = SessionSuspended) and (ISRWaiting) then pe; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); var rcmd:read_cmd_type; tries:integer; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin tries := 0; repeat tries := tries + 1; rcmd :=  ioresult := ord(zbadmode) else begin pcmd := prevent_cmd_const; pcmd.lunit := LUN; ioresult := ScsiHandleSession(pSB, addr(pcmd), sizeof(pcmd), Nil, 0, false, Nil, 0, false); end; end; procedure ScsiDiscAllow( pSB:Ptrread_cmd_const; rcmd.lunit := LUN; rcmd.block_n := BlockStart; rcmd.lmsb := NumBlocks div Hex('100'); rcmd.llsb := NumBlocks mod Hex('100'); ioresult := ScsiHandleSession(pSB, addr(rcmd), sizeof(rcmd), Buffer, NumBSessionBlockType); var acmd:prevent_allow_cmd_type; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin acmd := allow_cmd_const; acmd.lunit := LUN; ioresult := ScsiHandleSession(pSB, addr(acmd), sizeof(acmd), locks*NumBytesBlock, true, Nil, 0, false); until (ioresult <> ord(zbadblock)) or (tries >= 2); end; end; procedure ScsiDiscWrite(pSB:PtrSessionBlockType; BlockStart, NumBlocks, NumBytesBlock:integer; Buffer:ANYPTR); var wcmd:write_cmd Nil, 0, false, Nil, 0, false); end; end; end. {module SCSIIF} _type; tries:integer; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin tries := 0; repeat tries := tries + 1; wcmd := write_cmd_const; wcmd.lunit := LUN; wcmd.block_n := BlockStart; wcmd.lmsb := { SCSI ISR handler. Contains the SCSI ISR interface. } module SCSI_ISR; import SCSI_DEFS, SCSI_UTILS, OSD_LL, HWI_UTILS, STATE_DRIVE, COMMANDS; export procedure isrScsiISR(Sc:S_TYPE_ISC); implement procedure isrScsiISR(Sc:S_TYPE_ISC); var pScBlock:NumBlocks div Hex('100'); wcmd.llsb := NumBlocks mod Hex('100'); ioresult := ScsiHandleSession(pSB, addr(wcmd), sizeof(wcmd), Nil, 0, false, Buffer, NumBlocks*NumBytesBlock, true); until (ioresult <> ord(zbadblock))PtrSelectCodeBlockType; pSB:PtrSessionBlockType; i,j:integer; IsrSessionFound:Boolean; ResultCode:EventType; b:integer; mask:integer; begin try { Find the first session block that is in a run state (only one allowed) } mask := 0; pScBlock := o or (tries >= 2); end; end; procedure ScsiDiscFormat(pSB:PtrSessionBlockType; InterLeave:s_short); var saveDoNotDisconnect:boolean; fcmd:format_cmd_type; begin with pSB^ do if Overlap then ioresult := ord(zbadmode) else begin fcmd := fsdGetScBlock(Sc); with pScBlock^, PtrScsiChip^ do begin IsrSessionFound := false; i := 0; repeat pSB := DeviceSessionPtrs[i]; if pSB <> nil then with pSB^, InternalBlock do begin if (SessionState = SessionRunning) and (ISRWaiting)      begin IsrSessionFound := true; mask := IsrMask; end; end; end; if (IsrSessionFound) and (mask <> 0) and (osdBitOr(ints.ints, mask) = mask) then begin { session isrproc is expecting and can handle the isr } StartState(pSB)tartState(PtrSessionBlock:PtrSessionBlockType); Var SaveLevel:integer; i:integer; MyMachine['SCSI_DRIVER'] : integer; begin with PtrSessionBlock^, InternalBlock.pScBlock^ do begin { set interrupt level } SaveLevel := osdGetRunLevel; if SaveLevel; end else begin { Either no session claims ISR or session can't handle it. } if IsrSessionFound then begin { session can not handle the isr, kill the session and reset the device } utlSetInternalErr(pSB, ScsiIn < ScsiIntLevel then osdSetRunLevel(ScsiIntLevel) else SaveLevel := 100; {larger than the largest interupt level} { If session is not running, initialize the exec's control record. } if SessionState = SessionWaiting then begin SessionState :teruptErr); pSB^.InternalBlock.ISRError := True; StartState(pSB); end else begin { Reset the Hardware and unlink all sessions. } cmdSCCleanUp(Sc); end; end; end; recover begin cmdSCCleanUp(Sc); end; {recover} en= SessionRunning; init_exec_control(addr(InternalBlock.StateControlRec), PtrSessionBlock, MyMachine, state_stack_size); if DoTrace then begin i := TraceSize Div sizeof(trace_data_elt); TraceStuff := addr(InternalBlock.StateControlRec); d; end; end else begin i := 0; TracePtr := Nil; end; init_trace(addr(InternalBlock.StateControlRec), i, TracePtr); trace_control(addr(InternalBlock.StateControlRec), DoTrace); { turn on tracing } end; { Call the state machine. } exec(addr(I{ Scsi Utilities Routines Utilities that are specifically related to SCSI operations, and do not have a home in HWI_UTILS, MESSAGES, or COMMANDS should be placed here. } module SCSI_UTILS; import SCSI_DEFS; export Procedure utlSetInternalErr(pSB:PnternalBlock.StateControlRec)); { If the state machine terminated abnormally, be sure that the sessioncomplete flag is set. } with InternalBlock.StateControlRec do begin if (mdone) and (exit_code < 0) and (SessionState <> SessionComplete)trSessionBlockType; ie:InternalErrType); implement Procedure utlSetInternalErr(pSB:PtrSessionBlockType; ie:InternalErrType); begin with pSB^ do if InternalStatus = NoIntErr then {No internal error has been encountered} InternalStatus := ie; end; end then begin utlSetInternalErr(PtrSessionBlock, StateMachineErr); InternalBlock.StateErrCode := exit_code; InternalBlock.StateErrExt := exit_extension; call(InternalBlock.SysCleanUp, SelectCode); end; end; { reset interrupt level } ; if SaveLevel < ScsiIntLevel then osdSetRunLevel(SaveLevel); end; end; end; { Module: State_Drive interfaces the scsi driver to the state driver (exec) in state_procs } MODULE STATE_DRIVE; import STATE_PROCS, SCSI_DEFS, SCSI_UTILS, OSD_LL; export Procedure StartState(PtrSessionBlock:PtrSessionBlockType); implement Procedure S INCLUDE ST_EQU *$machine_name AbortPath *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgIsPathActive *$event_pairs_catch * NoEvent,state_2 *       standard * MESSAGES_msgIdentifyMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * NeedSynchParms,state_3 * MsgIn,state_4 * ScsiErr,state_exit * state_exit ***************2767; state_name_string = string[17]; control_recp = ^control_rec; stack_rec = record machine : anyptr; oldstate: anyptr; end; trace_data_type = (tstate,tproc,tmachine,tevent); trace_data_elt = record case data_type : trace**************************************** *state_3 standard * MESSAGES_msgInitSynchParms * HWI_UTILS_hwiGetPhase *$event_pairs_catch * state_exit ******************************************************* *state_data_type of tstate, tevent : (short_data : st_short); tproc, tmachine : (long_data : integer); end; trace_data_ptr = ^trace_data; trace_data = array[1..maxint] of trace_data_elt; trace_name_elt = packed record  state_exit ******************************************************* *state_2 standard * HWI_UTILS_hwiGetMsgOut *$event_pairs * MsgOut,state_3 * ScsiErr,state_exit * BusFree,state_exit * _4 standard * MESSAGES_msgGetMsg *$event_pairs_catch * Synch,state_5 * ScsiErr,state_exit * state_6 ******************************************************* *state_5 standard *  BusBusy,state_exit ******************************************************* *state_3 standard * MESSAGES_msgAbortMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * ScsiErr,state_exit * sta MESSAGES_msgTargetSynchParms * HWI_UTILS_hwiGetPhase *$event_pairs_catch * state_exit ******************************************************* *state_6 standard * MESSAGES_msgRejectMsg * HWIte_exit ******************************************************* *exec_err standard * COMMANDS_cmdStateErr *$event_pairs_catch * state_exit ******************************************************* *state_exit mexit * _UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * MsgOut,state_2 * state_exit ******************************************************* *exec_err standard * COMMANDS_cmdStateErr *$event_pai 0 ******************************************************* *$end_machine ******************************************************* rs_catch * state_exit ******************************************************* *state_exit mexit * 0 ******************************************************* *$end_machine ****************************************************** INCLUDE ST_EQU *$machine_name EstablishPath *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgSelect * HWI_UTILS_hwiGetPhase *$event_pairs_catch * *  WaitForIsr,state_1a * MsgOut,state_2 * state_exit ******************************************************* *state_1a suspend * state_1 ******************************************************* *state_2 MODULE STATE_PROCS; { state machine executive for machine maker 4.0 } EXPORT CONST bad_state_type = -1; bad_exit_type = -2; event_not_found = -3; too_many_calls = -4; proc_escaped = -5; TYPE st_short = 0..65535; short_signed= -32768..3      offset : st_short; name : state_name_string; end; trace_name_table_ptr = ^trace_name_table_type; trace_name_table_type = array[1..maxint] of trace_name_elt; control_ptr = ^control_rec; control_rec = record user_space : anyph cont^ do begin tactive := false; ttotal := size; tremaining := size; tdata := p; end; end; { init_trace } procedure trace_control(cont : control_ptr; on_off : boolean); begin with cont^ do begin tactive := on_off;tr; states : anyptr; { state machine table } current_state : st_short; { offset into states } exit_code : short_signed; exit_extension: short_signed; mdone : boolean; tactive : boolean; tremaining : if on_off then tactive := tremaining>0; end; end; { trace_control } procedure init_exec_control( cont : control_ptr; user : anyptr; anyvar machine : integer; stack_size : integer); begin with cont^ do  integer; ttotal : integer; tdata : trace_data_ptr; max_stack : st_short; last : st_short; stack : array[1..1] of stack_rec; { this record will be allocated to contain the space specified inbegin user_space := user; states := addr(machine); current_state := 0; exit_code := 0; exit_extension:= 0; mdone := false; tactive := false; { disable tracing } tremaining := 0; max_stack := stack_size; last := 0; end the max_stack field } end; procedure exec(cont : control_ptr); procedure init_exec_control(cont : control_ptr; user : anyptr; anyvar machine : integer; stack_size : integer); procedure reset_exec_control(cont : control_p; end; { init_exec_control } procedure reset_exec_control(cont : control_ptr; user : anyptr); begin with cont^ do begin user_space := user; current_state := 0; exit_code := 0; exit_extension:= 0; mdone := false; tr; user : anyptr); procedure init_trace(cont : control_ptr; size : integer; p:ANYPTR); procedure trace_control(cont : control_ptr; on_off : boolean); IMPLEMENT TYPE short_ap = ^short_array; state_proc = procedure(stuff:anyptr; var event:st_stactive := false; tremaining := ttotal; if last<>0 then states := stack[1].machine; last := 0; end; end; { reset_exec_control } procedure exec(cont :control_ptr); const first_state = 2; type intp =hort); pairs_rec = packed record event, next : st_short; end; short_array = packed array[0..100] of st_short; short_pairs = packed array[0..100] of pairs_rec; int_array = packed array[0..100] of integer; mixed_array = record case in ^integer; var running: boolean; state : state_ptr; { also global error state offset } prev_state : state_ptr; procp : intp; count : st_short; event : st_short; temps : st_short; funny : record cteger of 1:(exits:short_array); 2:(exit_pairs:short_pairs); 3:(procs:int_array); end; state_ptr = ^state_rec; state_rec = packed record class : char; exits_type: char; case integer of 0:(); 1:(nexits : charase integer of 1:(proc : state_proc); 2:(proca : integer; static : integer); end; procedure do_trace(ttype:trace_data_type); begin with cont^, tdata^[tremaining] do begin data_type := ttype; case data_type of ; nprocs : char; table : mixed_array); 2:(next_s : short_signed); 3:(next_m : anyptr); 4:(next_p : integer) end; $RANGE OFF$ procedure init_trace(cont : control_ptr; size : integer; p:anyptr); begin wit tstate : short_data := current_state; tmachine : long_data := ord(states); tproc : long_data := funny.proca; tevent : short_data := event; otherwise end; tremaining := tremaining - 1; tactive := trem     d_exit_type); end; { case exit_type } end; { with state^ } end; { find_next_state } begin { exec } funny.static := 0; running := true; state := nil; with cont^ do begin if tactive then do_trace(tmachine); mdone_state := next_s; end; #4:{ DONE_EXIT } begin shutdown(next_s); end; otherwise shutdown(bad_state_type); end; end; until not running; end; end;{ exec } END; { STATE_PROCS }  := false; if current_state = 0 then current_state := first_state; { skip error index } repeat prev_state := state; state := addr(intp(states)^,current_state); if tactive then do_trace(tstate); with state^ do begin case class of  INCLUDE ST_EQU *$machine_name SCSI_DRIVER *$global_recover state_10 ******************************************************* *state_1 standard * HWI_UTILS_hwiGetPhase *$event_pairs * BusFree,state_3 * BusBusaining>0; end; end; { do_trace } procedure shutdown(ecode:short_signed); var is_bad : boolean; begin with cont^ do begin is_bad := true; if exit_code=0 then if (ecode=proc_escaped) or (ecode=event_not_found) then #0:{ STANDARD } begin try case exits_type of #0,#1:procp := addr(table.exits[ord(nexits)]); #2,#3:procp := addr(table.exit_pairs[ord(nexits)]); otherwise shutdown(bad_exit_type); end; count := ord(nprocs); begin exit_code := ecode; if (ecode=proc_escaped) then exit_extension := escapecode else if (ecode=event_not_found) then exit_extension := event; current_state := short_ap(states)^[0]; is_bad := false; end; if is_bad then begin while count>0 do { execute all the procedures } begin funny.proca := procp^; if tactive then do_trace(tproc); call(funny.proc,user_space,event); if tactive then do_trace(tevent); if event<>0 then count := 0  mdone := true; running := false; exit_code := ecode; end; end; end; { shutdown } procedure find_next_state; label 1; begin with cont^, state^ do begin case exits_type of #0,#1: { singles & singles_catch } else begin count := count-1; procp := addr(procp^,sizeof(procp^)); end; end; find_next_state; recover begin shutdown(proc_escaped); end; end; #1:{ MCALL } if last0 then begin } end else count := succ(count); end; { check for catch all } if exits_type = #3 then current_state := table.exit_pairs[ord(nexits)-1].next else shutdown(event_not_found); 1: end; otherwise shutdown(bastates := stack[last].machine; state := stack[last].oldstate; last := last - 1; if tactive then do_trace(tmachine); find_next_state; end else shutdown(next_s); #3:{ SUSPEND } begin running := false; current     y,state_2 * ScsiErr,state_12 ******************************************************* *state_2 standard * MESSAGES_msgWaitTimeOrFree *$event_pairs * BusFree,state_3 * ScsiErr,state_12 **********In,state_11 * CmdPhase,state_11 * DataPhase,state_11 * StatusPhase,state_11 * BusBusy,state_11 * MsgOut,state_11 ******************************************************* *state_8 s********************************************* *state_3 mcall * EstablishPath *$event_pairs * CmdPhase,state_4 * BusBusy,state_2 * StatusPhase,state_6 * ScsiErr,state_12 * tandard * COMMANDS_cmdTerminateSession *$event_pairs_catch * state_exit ******************************************************* *state_10 standard * COMMANDS_cmdStateErr *$event_pairs_catch * st BusFree,state_11 * MsgIn,state_11 * MsgOut,state_11 * DataPhase,state_11 ******************************************************* *state_4 mcall * DoTransfer *$event_pairs * ate_12 ******************************************************* *state_11 standard * COMMANDS_cmdPhaseErr *$event_pairs_catch * state_12 ******************************************************* *state_12 mcall * DataPhase,state_5 * StatusPhase,state_6 * ScsiErr,state_12 * BusBusy,state_11 * CmdPhase,state_11 * BusFree,state_11 * MsgIn,state_11 * MsgOut,state_11 ****** AbortPath *$event_pairs_catch * BusFree,state_13 * BusBusy,state_13 * state_14 ******************************************************* *state_13 standard * COMMANDS_cmdTerminateSession ************************************************** *state_5 mcall * DoTransfer *$event_pairs * StatusPhase,state_6 * ScsiErr,state_12 * BusBusy,state_11 * CmdPhase,state_11 * $event_pairs_catch * state_exit ******************************************************* *state_14 standard * HWI_UTILS_hwiHardReset * COMMANDS_cmdUnlinkAllSessions *$event_pairs_catch * state_ex DataPhase,state_11 * BusFree,state_11 * MsgIn,state_11 * MsgOut,state_11 ******************************************************* *state_6 standard * COMMANDS_cmdGetStatus * it ******************************************************* *state_exit mexit * 0 ******************************************************* *$end_machine  HWI_UTILS_hwiGetPhase *$event_pairs * MsgIn,state_7 * ScsiErr,state_12 * DataPhase,state_11 * StatusPhase,state_11 * BusBusy,state_11 * CmdPhase,state_11 *  INCLUDE ST_EQU *$machine_name TerminatePath *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgGetMsg *$event_pairs_catch * CmdComplete,state_2 *  BusFree,state_11 * MsgOut,state_11 ******************************************************* *state_7 mcall * TerminatePath *$event_pairs * BusFree,state_8 * ScsiErr,state_12 * Msg ScsiErr,state_exit * state_3 ******************************************************* *state_2 standard * MESSAGES_msgWaitTimeOrFree *$event_pairs_catch * state_exit ***************************************     r information output to screen} { dvrtemp2 values. dvrtemp2 initialized to -1 by CTABLE. } DeviceOK = -1; DeviceAlwaysOffline = 1; type ScsiTmRecType = packed record CurrentBlock:integer; BlockBuffer:packed array [ 0 .. (MAXBLOCKSIZE-1) ]  NumBlocks); if ioresult = ORD(inoerror) then begin dvrtemp := BlockSize; $IF DEBUG$ WRITELN('READ CAPACITY: BLOCK SIZE IS ',BlockSize); WRITELN('READ CAPACITY: MEDIUM SIZE IS ', BlockSize*(NumBlocks)); $END$ { if block is of char; SB:SessionBlockType; end; PtrScsiTmRecType = ^ScsiTmRecType; var $if TDEBUG$ LISTING:TEXT; LocTracePtr:ANYPTR; $END$ pTmRec:PtrScsiTmRecType; procedure scsidisc(fp : fibp; request : amrequesttype; anyvar bnot a power of 2, then then can't support this device. } i := BlockSize; while(i > 0) and not odd(i) do begin i := i div 2; end; if (i <> 1) {blocksize isn't a power of 2!} or (BlockSize > MAXBLOCKSIZE) then begin dvrtemp**************** *state_3 standard * MESSAGES_msgRejectMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_1 * state_exit ******************************************************* *execuffer : window; length, position : integer); implement { type uep_type = ^unitentry; } { JWH now in SCSIIF } Function CheckDev(pUnit:uep_type; pSB:PtrSessionBlockType):boolean; begin { return TRUE if medium has changed, FALSE for ALL ot_err standard * COMMANDS_cmdStateErr *$event_pairs_catch * state_exit ******************************************************* *state_exit mexit * 0 ******************************************************* her cases } with pTmRec^ do begin ScsiCheckDev(pSB); if (ioresult = ord(zmediumchanged)) then begin CheckDev := TRUE; if (not pUnit^.ureportchange) then begin { continue to talk with device, but force internal buffers to b*$end_machine ******************************************************* e empty. } CurrentBlock := -1; ioresult := ord(inoerror); end; { for McBeth tape drive : } if pUnit^.devid = -2 then begin if SyncMcBeth(pSB) = 0 then begin CheckDev := FALSE; ioresult := ord(inoerror); {system options} $modcal on$ $allow_packed on$ $partial_eval on$ {code generation options} $debug off$ $LINENUM 10000$ $iocheck off$ $ovflcheck off$ $range off$ $stackcheck off$ {listing options} $lines 57$ $pagewidth 130$ $copyright 'Hewlett Packard Com end; end; end else CheckDev := FALSE; end; end; Procedure Inquire(pUnit:uep_type; pSB:PtrSessionBlockType); var DevType, AnsiVersion:integer; Removable:boolean; s:string255; begin with pUnit^ do begin ScsiDevInfo(pSB, DevType, AnsiVerpany, 1989'$ program scsidisc_init{{(INPUT, OUTPUT){For DEBUG and XDEBUG}; {} $search 'SCSILIB.'$ {{ $search 'SCSILIB.', 'PWS_SCSI'$ {PWS_SCSI needed for TDEBUG} $page$ module SCSIDISCMODULE; import sysglobals, asm, IODECLARATIONS, SCSILIB, LOADER; exsion, Removable, s); if ioresult = ORD(inoerror) then begin { set the uisfixed flag in the unitable. pad = 1 means to treat removable media like hard disk. } if (pad = 1) then begin uisfixed := TRUE; if (NOT Removable) theport const MAXBLOCKSIZE = 65536; { 4096; } { JWH for McBeth support } DEBUG = FALSE; {general debug info output to screen - have to change SCSIIF!} TDEBUG = FALSE; {trace is generated on internal err - have to change SCSIIF!} XDEBUG = FALSE; {transfen pad := 0; end else uisfixed := NOT Removable; end; end; end; Procedure ReadCapacity(pUnit:uep_type; pSB:PtrSessionBlockType); var i:integer; BlockSize, NumBlocks:integer; begin with pUnit^ do begin ScsiDiscBlocks(pSB, BlockSize,      := 0; ioresult := ord(znomedium); end else if NOT uisfixed OR (umaxbytes = -1) then umaxbytes := BlockSize * NumBlocks; end else dvrtemp := 0; end; end; Procedure tmSCSIstatus(pUnit:uep_type; pSB:PtrSessionBlockType); var NewDevice ( (MediumHasChanged) or (ioresult = ord(znotready)) ) then begin { user has removed a floppy that is supposed to be treated like a hard disk - do not talk to it any more. } dvrtemp2 := DeviceAlwaysOffline; io, MediumHasChanged:boolean; DAV:DeviceAddressVectorsType; iotemp:integer; begin with pUnit^, pTmRec^, pSB^ do begin NewDevice := FALSE; MediumHasChanged := FALSE; if (sc <> SelectCode) or (ba <> Device) or (du <> LUN) or (dv <> SUN) result := ord(znodevice); end; end; if (NewDevice) or (MediumHasChanged) or (ioresult <> ord(inoerror)) then CurrentBlock := -1; end; end; {*******************************************************************} { Same as transfer but for sequent or (dvrtemp = 0) then begin $IF DEBUG$ WRITELN('INITIALIZING SCSI'); $END$ NewDevice := TRUE; DAV.sc := sc; DAV.ba := ba; DAV.du := du; DAV.dv := 0; ScsiSBInit(pSB, addr(DAV)); $if TDEBUG$ DoTrace :=ial devices , dt = 1. } { For McBeth support 5/18/93 JWH , devid = -2 in the unit table. } { } { Note - for tape_transfer, the number of bytes to transfer must be } { a TRUE; TraceSize := trace_size; TracePtr := LocTracePtr; $end$ end; if (NewDevice) or (NOT uisfixed) then begin MediumHasChanged := CheckDev(pUnit, pSB); { CRITICAL HOTSITE DEFECT REPAIR DEW 09/26/90 Problem is that n exact multiple of the blocksize ! } { Also, the transfer must begin exactly on a block boundary !} {*******************************************************************} procedure tape_transfer(pSB:PtrSessionBlockType; uumaxbytes is being overwritten in tmSCSIstatus on first call to TM. This causes partitioned discs to loose their boundaries, opening up the disc to potential data loss, i.e. unit #11 can now overwrite unit#12. Umaxbytes is being overwritteep: uep_type; request: amrequesttype; bufptr: charptr; abs_position, length: integer); var blocksize: integer; block, intra_block_offset, partial_length: integer; procedure checkio; begin if ioresult <> ord(inoerror) then escape(-10); end; n in the ReadCapacity call below because uisfixed is not set correctly. The uisfixed field is set by the Inquire command. An Inquire only needs to be done when dvrtemp = 0, which indicates CTABLE has just called the TM for the first ti begin {tape_transfer} with pTmRec^ do begin try {block size is known } blocksize := uep^.dvrtemp; block := abs_position div blocksize; intra_block_offset := abs_position mod blocksize; partial_length := length mod blocksize; length := length div me. As Inquire will swallow the status required by CheckDev, the Inquire follows this call. As the ioresult value set by CheckDev is checked after the Inqurie, ioresult needs to be saved. } if (dvrtemp = 0) then begin iotemp :blocksize; { now holds # blocks not bytes } $IF XDEBUG$ WRITELN; WRITELN; WRITELN; WRITELN('TAPE TRANSFER REQUEST: ', REQUEST); WRITELN('LENGTH: ', LENGTH); WRITELN('POSITION: ', ABS_POSITION); WRITELN('SCSI BLOCK: = ioresult; Inquire(pUnit, pSB); ioresult := iotemp; end; if (dvrtemp = 0) or ((MediumHasChanged) and (NOT uisfixed)) then begin ReadCapacity(pUnit, pSB); end else if (pad = 1) and {removable media treated like hard disk} ', BLOCK); WRITELN('SCSI INTRA-BLOCK: ', INTRA_BLOCK_OFFSET); WRITELN('SCSI BLOCKSIZE: ', BLOCKSIZE); readln; $END$ if ((intra_block_offset<>0) { doesn't start on block boundary !! } OR (partial_length <> 0)) { not even multiple of bl      ', ABS_POSITION); WRITELN('SCSI BLOCK: ', BLOCK); WRITELN('SCSI INTRA-BLOCK: ', INTRA_BLOCK_OFFSET); WRITELN('SCSI BLOCKSIZE: ', BLOCKSIZE); readln; $END$ if (blocksize <= 256) and (intra_block_offset<>0) then begin ioresult := ordIAL BLOCK'); $END$ {read block into TmRec} if CurrentBlock <> block then begin $IF XDEBUG$ WRITELN('ScsiDiscRead necessary: ',BLOCKSIZE:1,' ',BLOCK:1); $END$ CurrentBlock := block; ScsiDiscRead(pSB, block, 1, blocksize, add(zbadmode); escape(-10); end; { Calculate partial first block parameters. } partial_length := blocksize-intra_block_offset; if partial_length > length then {entire transfer in one block} partial_length := length; case request of readbytes, sr(BlockBuffer[0])); checkio; end; {read data from TmRec into user's buffer} moveleft(BlockBuffer[0], bufptr^, partial_length); end; end; writebytes, startwrite: begin { handle partial block at beginning of transfer. } if intra_ocks !! } then begin ioresult := ord(zbadmode); escape(-10); end; case request of readbytes, startread: begin { read the number of blocks requested } { directly into users buffer : } if (length>0) then begin {read directlytartread: begin { handle partial block at beginning of transfer. } if intra_block_offset>0 then begin $IF XDEBUG$ WRITELN('READING FIRST PARTIAL BLOCK'); $END$ {read block into TMRec} if CurrentBlock <> block then begin  into user's buffer} ScsiTapeRead(pSB, block, length, blocksize, bufptr); checkio; end; end; writebytes, startwrite: begin { write the number of blocks requested } { directly from users buffer : } if length>0 then begin  $IF XDEBUG$ WRITELN('ScsiDiscRead necessary: ',BLOCKSIZE:1,' ',BLOCK:1); $END$ CurrentBlock := block; ScsiDiscRead(pSB, block, 1, BlockSize, addr(BlockBuffer[0])); checkio; end; {move data from TMRec into user's buffer} move {write user's buffer to disc} ScsiTapeWrite(pSB, block, length, blocksize, bufptr); checkio; end; end; { writebytes } end; {case} recover begin if escapecode <> -10 then escape(escapecode); $IF XDEBUG$ blocksize := ioresult; WRITELN('TRANleft(BlockBuffer[intra_block_offset], bufptr^, partial_length); bufptr := addr(bufptr^, partial_length); block := block + 1; length := length-partial_length; end; { set up for multiple block read in middle and partial read on last bloSFER ERROR, IOTEMP: ',BLOCKSIZE); ioresult := blocksize; $END$ end; {try/recover} end; {with} end; {tape_transfer} procedure transfer(pSB:PtrSessionBlockType; uep: uep_type; request: amrequesttype; bufptr: charptr; abs_position, length: inteck. } partial_length := length mod blocksize; length := length div blocksize; if (blocksize <= 256) and (partial_length <> 0) then begin {read entire last block for small last partial block reads} partial_length := 0; length := length + ger); var blocksize: integer; block, intra_block_offset, partial_length: integer; procedure checkio; begin if ioresult <> ord(inoerror) then escape(-10); end; begin {transfer} with pTmRec^ do begin try {block size is known} blocksize := uep^.1; end; { handle multiple block reads } if (length>0) then begin $IF XDEBUG$ WRITELN('READING MULTIPLE MIDDLE BLOCKS'); $END$ {read directly into user's buffer} ScsiDiscRead(pSB, block, length, blocksize, bufptr); checkio; dvrtemp; block := abs_position div blocksize; intra_block_offset := abs_position mod blocksize; $IF XDEBUG$ WRITELN; WRITELN; WRITELN; WRITELN('TRANSFER REQUEST: ', REQUEST); WRITELN('LENGTH: ', LENGTH); WRITELN('POSITION:  bufptr := addr(bufptr^, length*blocksize); block := block+length; length:=0; end; { handle partial block at end of transfer. } if (partial_length > 0) then {partial block at back} begin $IF XDEBUG$ WRITELN('READING LAST PART     block_offset>0 then begin $IF XDEBUG$ WRITELN('WRITING PARTIAL BLOCK AT FRONT'); $END$ {read block into TMRec} if CurrentBlock <> block then begin $IF XDEBUG$ WRITELN('ScsiDiscRead necessary: ',BLOCKSIZE:1,' ',BLOCK:1); $EcRead(pSB, block, 1, blocksize, addr(BlockBuffer[0])); checkio; end; {move user's buffer into TmRec} moveleft(bufptr^, BlockBuffer[0], partial_length); end; {write out TmRec into last block} ScsiDiscWrite(pSB, block, 1, BlockSizND$ CurrentBlock := block; ScsiDiscRead(pSB, block, 1, BlockSize, addr(BlockBuffer[0])); checkio; end; {read user's data into TmRec block} moveleft(bufptr^, BlockBuffer[intra_block_offset], partial_length); {write TmRec block backe, addr(BlockBuffer[0])); checkio; end; CurrentBlock := -1; { JWH 8/30/91 } end; { writebytes } end; {case} recover begin if escapecode <> -10 then escape(escapecode); CurrentBlock := -1; $IF XDEBUG$ blocksize := ioresult; WRITELN( to disc} ScsiDiscWrite(pSB, block, 1, BlockSize, addr(BlockBuffer[0])); checkio; bufptr := addr(bufptr^, partial_length); block := block + 1; length := length-partial_length; end; { set up for multiple block write in middle and 'TRANSFER ERROR, IOTEMP: ',BLOCKSIZE); ioresult := blocksize; $END$ end; {try/recover} end; {with} end; {transfer} Procedure ZapBadDevice(pUnit:uep_type); type CompareType = packed record Ctm:amtype; Csc: byte; Cba: byte; Cdu: byte; Cd partial write on last block. } partial_length := length mod blocksize; length := length div blocksize; {length is number of blocks} { handle blocks in middle. } if length>0 then begin $IF XDEBUG$ WRITELN('WRITING MIDDLE BLOCKSv: byte; end; pCompareType = ^CompareType; var i:integer; pC:pCompareType; begin { Kill all units that are talking to the same device as this unit. } pC := addr(pUnit^.tm); for i := 0 to maxunit do with uep_type(addr(unitable^[i]))^, pC^ do'); $END$ {write user's buffer to disc} ScsiDiscWrite(pSB, block, length, blocksize, bufptr); checkio; bufptr := addr(bufptr^, length*blocksize); block := block + length; end; { handle partial block at end of transfer. } if p begin if (sc = Csc) and (ba = Cba) and (du = Cdu) and (dv = Cdv) then dvrtemp2 := DeviceAlwaysOffLine; end; end; procedure scsidisc(fp : fibp; request : amrequesttype; anyvar buffer : window; length, position : integeartial_length>0 then begin $IF XDEBUG$ WRITELN('WRITING LAST PARTIAL BLOCK'); $END$ { zero pad small sectors instead of the read modify write operation used for big block sizes } if blocksize < 256 then begin {overwrir); label 1; var pSB:PtrSessionBlockType; pUnit:uep_type; Num16MXfer, Mod16MSize, i:integer; begin $IF DEBUG$ WRITELN('SCSITM REQUEST: ',REQUEST); $END$ ioresult := ord(inoerror); pSB := addr(pTmRec^.SB); pUnit := addr(unitable^[fp^.funit]); witte block in TmRec, using zero pad} CurrentBlock := block; moveleft(bufptr^, BlockBuffer[0], partial_length); BlockBuffer[partial_length] := #0; moveleft(BlockBuffer[partial_length], BlockBuffer[partial_length+1], blocksize-partialh fp^, pUnit^, pSB^ do begin if (offline) or (dvrtemp2 = DeviceAlwaysOffline) then begin ioresult := ord(znodevice); goto 1; end; case request of clearunit: begin dvrtemp2 := DeviceOK; LUN := 255; tmSCSIstatus(pUnit, pSB); i_length-1); end else begin {read last partial block into TmRec} if CurrentBlock <> block then begin $IF XDEBUG$ WRITELN('ScsiDiscRead necessary: ',BLOCKSIZE:1,' ',BLOCK:1); $END$ CurrentBlock := block; ScsiDisf (ioresult = ord(zmediumchanged)) or (ioresult = ord(znotready)) then ioresult := ord(inoerror); { CRITICAL HOTSITE DEFECT REPAIR DEW 09/26/90 Problem is that umaxbytes is being overwritten in tmSCSIstatus on first call to TM      while (Num16MXfer > 0) do begin if devid = -2 then { JWH 6/93 } tape_transfer(pSB, pUnit, request, addr(buffer), position+fileid+byteoffset, hex('00ffffff')) else { disks - same as before } trans begin found := ptr.syp^=symbol; ptr.a := ptr.a+strlen(ptr.syp^)+1; ptr.a := ptr.a+ord(odd(ptr.a)); valueptr.a := ptr.a+2; if found then value := valueptr.vep^.value; ptr.a := ptr.a+ptr.gvp^.short; end; {while} modpfer(pSB, pUnit, request, addr(buffer), position+fileid+byteoffset, hex('00ffffff')); if (ioresult <> ord(inoerror)) then goto 1; position := position + hex('00ffffff'); Num16MXfer := Num16MXfer - 1; end;  := link; end; {with modp^} end; {value} $end$ BEGIN newbytes(pTmRec, sizeof(ScsiTmRecType)+4); pTmRec := addr(pTmRec^, 4 - (integer(pTmRec) mod 4)); {force long word alignment} $if TDEBUG$ newbytes(LocTracePtr, trace_size); . This causes partitioned discs to loose their boundaries, opening up the disc to potential data loss, i.e. unit #11 can now overwrite unit#12. The fact the uisfixed field of the unitable is not set correctly prior to calling tmSCSIstatus  if devid = -2 then { JWH 6/93 } tape_transfer(pSB, pUnit, request, addr(buffer), position+fileid+byteoffset, Mod16MSize) else { disks ... } transfer(pSB, pUnit, request, addr(buffer), position+fileicauses the problem. The purpose of the Inquire call (below) is to set the uisfixed field. This is done to complete the handshake between CTABLE and the TM. The Inquire call can not be made prior to tmSCSIstatus because the Inquire cod+byteoffset, Mod16MSize); end; end; end; otherwise ioresult := ord(ibadrequest); end; {case} 1: if ioresult <> ord(inoerror) then begin LUN := 255; if ioresult = ord(zmediumchanged) then begin umediavalid := fauld swallow the status needed by a call to CheckDev that determines if the media has been changed. CheckDev is made in tmSCSIstatus and is appropriate there. Thus, Inquire is moved to tmSCSIstatus. if (ioresult = ord(inoerror)) then lse; end; if (ioresult = ord(znodevice)) and (dvrtemp2 = DeviceAlwaysOffLine) then begin { find all other units this device is attached to, and make sure they are turned off! } ZapBadDevice(pUnit); end; end; $IF DE Inquire(pUnit, pSB); } end; unitstatus: fbusy := false; {overlap not implemented} flush:; readbytes, writebytes, startread, startwrite: {startread, startwrite means overlap - not implemented} begin tmSCSIstatus(pUnit, pSB); iBUG$ i := IORESULT; WRITELN('EXITING TM RESULT IS: ',i); ioresult := i; $END$ end; {with} end; end; {SCSIDISCMODULE} import SCSIDISCMODULE, loader, ASM {{,sysglobals,iodeclarations {for auto insertion into unitable} {{,SCSILIBf ioresult = ord(inoerror) then begin if ureportchange and not umediavalid then ioresult := ord(zmediumchanged) else if (position<0) or (length<0) or (position+length>fpeof) then ioresult := ord(ieof) else begin if (length {FOR TDEBUG} ; $if FALSE$ VAR dam_proc: packed record case integer of 0: (dam: damtype); 1: (value, slink: integer); end; function value(symbol: string255): integer; var modp: moddescptr; ptr, valueptr: addrec;  > hex('00ffffff')) then {scsi max xfer is $00ffffff} begin Num16MXfer := length div hex('00ffffff'); Mod16MSize := length mod hex('00ffffff'); end else begin Num16MXfer := 0; Mod16MSize := length; end;  found: boolean; begin {value} value := 0; found := false; modp := sysdefs; while (modp<>nil) and not found do with modp^ do begin ptr := defaddr; while (ptr.a Nil then begin PtrSessionBlock := DeviceSessionPtrs[i]; t(SelectCode:S_TYPE_ISC); { State Machine Procedures } Procedure CmdGetStatus (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure CmdTerminateSession (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Pro repeat with PtrSessionBlock^ do begin utlSetInternalErr(PtrSessionBlock, ScsiCatastrophicErr); if (SessionState = SessionSuspended) then DoAReset := true else if (SessionState = SessionRunning) then begin      rScsiChip^.psns.bsy then begin hwiSCHardReset(Sc); end else hwiSCInitHW(Sc); end; {************************************************************************* * Procedure CmdInitSession *************************************************************k^.SessionState := SessionComplete; ResultCode := ORD(ScsiErr); end; begin with PtrSessionBlock^, PtrSessionBlock^.InternalBlock do begin { Initialize the error fields. } InternalStatus := NoIntErr; SessionStatus := 0; { Verify the ************ * * On Input: * * * Functional Description: * * * Initialize the session block and internal block variables. * * ensure that the inbound run level (isr level) will allow * SCSI interrupts to occur. * * Link thisession block is not being used. } if SessionState in [SessionRunning, SessionSuspended] then begin LocSetErr(ScsiStackingErr); goto 1; end; { verify the session address parameters are correct. If one or more are not, then ScsiAddr init_exec_control(addr(InternalBlock.StateControlRec), PtrSessionBlock, MyMachine, state_stack_size); init_trace(addr(InternalBlock.StateControlRec), 0, Nil); trace_control(addr(InternalBlock.StateControlRec), FALSE); exec(addr(Is session block into the select code chain. * In the select code block exists a session block pointer for each device. * Link this session block in, and determine if this session can run or not. * * Rule1: If another session block existsnternalBlock.StateControlRec)); end; SessionState := SessionComplete; if (InternalBlock.CallBackLoaded) then call(SessionCompleteCallBack, PtrSessionBlock); PtrSessionBlock := InternalBlock.NextSession; end;  for this device, then link this * session block in, and set the ResultCode to WaitForIsr. It will * be the responsibity of TerminateSession to start this session. * * Rule2: If a session block exists for another device,until PtrSessionBlock = NIL; DeviceSessionPtrs[i] := Nil; end; end; if DMAInProgress then begin osdKillDMA(DMAChannel); osdReleaseDMAChannel(Sc); DMAInProgress := FALSE; config_reg.pal_reset := 1; end; end;  and that session * is Running or Suspended, then this session can not run (set ResultCode to WaitForISR). * In this case, TerminateSession will start this * session. * * Rule3: If Rule1 or Rule2 have not berecover ; if DoAReset then hwiSCHardReset(Sc); osdSetRunLevel(RunLevel); end; {************************************************************************* * CmdScCleanUP ************************************************************************* * en satisfied, then the session CAN run. * * * On Output: NoEvent if the session can run. ScsiErr if it can not. If the * Session is to be killed, then InternalStatus will be set, otherwise * the session has been linked in * On Input: Nothing expected. * Called when everything on this Scsi Select Code needs to * be cleaned up. * * Functional Description: * * Reset the scsi bus. * initialize the scsi hardware. * Clean up anto SelectCodeBlock and will run * when it can. * *************************************************************************} Procedure CmdInitSession(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); label 1; type tricky = recoy outstanding sessions. * * On Output: Scsi Select Code is cleaned up. * * *************************************************************************} Procedure CmdSCCleanUp(Sc:S_TYPE_ISC); begin cmdSCUnlinkAllSessions(Sc); if osdGetScBlock(Sc)^.Ptrd case boolean of true:(i:integer); false:(p:ScsiCallBackType); end; Var t:tricky; i:integer; locpSB:PtrSessionBlockType; procedure LocSetErr(ErrCode:InternalErrType); begin utlSetInternalErr(PtrSessionBlock, ErrCode); PtrSessionBloc     essErr } pScBlock := osdGetScBlock(SelectCode); if (pScBlock = Nil) or (Device < 0) or (Device > 7) or (LUN < 0) or (LUN > 7) or (SUN <> 0) then begin LocSetErr(ScsiAddressErr); goto 1; end; { Initialize the session and internao be started. * Initialize the session block and call the state driver to kick * things off. * * If the session can not run, then either it is complete or * it has been linked into the selectcode block and will run at * a latl blocks } SessionState := SessionWaiting; NextSession := NIL; ISRWaiting := False; SelectRetryCount := 0; t.p := SessionCompleteCallBack; CallBackLoaded := ((Overlap) and (t.i <> 0)); SysCleanUp := cmdSCCleanUp; { Make sure the incoter time. * * On Output: SessionResults are inthe session block. * *************************************************************************} Procedure DoSession(PtrSessionBlock:PtrSessionBlockType); Var ResultCode:S_SHORT; begin { if an escape mming interrupt level is not to high. } with pScBlock^ do begin if osdGetRunLevel >= ScsiIntLevel then begin LocSetErr(RunLevelErr); goto 1; end; { Check for Rule 1 } locpSB := DeviceSessionPtrs[Device]; if locpSB <gets this far out, be sure to clean up. } with PtrSessionBlock^ do try CmdInitSession(PtrSessionBlock, ResultCode); if (ResultCode = ORD(NoEvent)) then begin StartState(PtrSessionBlock); end; if not Overlap then while SessionState <> Ses> Nil then begin { Link this SessionBlock into the SessionBlock chain. } if not Overlap then begin LocSetErr(ScsiStackingErr); goto 1; end; while locpSB^.InternalBlock.NextSession <> NIL do locpSB := locpSB^sionComplete do ; recover begin CmdSCCleanUp(SelectCode); escape(escapecode); end; end; {************************************************************************* * DoAbort *******************************************************************.InternalBlock.NextSession; locpSB^.InternalBlock.NextSession := PtrSessionBlock; ResultCode := ORD(WaitForISR); goto 1; end; { CheckforRule 2 } DeviceSessionPtrs[Device] := PtrSessionBlock; for i := 0 to 7 do if i <> D****** * * On Input: SessionBlock comes from user. The session is overlapped. * The session was active at the time of the call, but they may have * changed. * * Functional Description: * * set interrupt level so that SCSI can no evice then begin locpSB := DeviceSessionPtrs[i]; if (locpSB <> Nil) and (locpSB^.SessionState in [SessionRunning, SessionSuspended]) then begin if not Overlap then begin LocSetErr(ScsiStackingErr); goto 1;longer interrupt * and make sure that the session is still active. * Set ISRError to TRUE and restart the session, This will * force the driver to attempt to send an ABORT message, and * if that fails, reset the bus. * * On Output end; ResultCode := ORD(WaitForISR); goto 1; end; end; { This session can Run. } ResultCode := ORD(NoEvent); end; end; 1: end; {************************************************************************* * DoSessio: * *************************************************************************} Procedure DoAbort(PtrSessionBlock:PtrSessionBlockType); var SaveLevel:integer; begin with PtrSessionBlock^, InternalBlock, pScBlock^ do begin { set interrupt level n ************************************************************************* * * On Input: SessionBlock has been filled out by user with Session * required information. * * * Functional Description: * * Called when session is t} SaveLevel := osdGetRunLevel; if SaveLevel < ScsiIntLevel then osdSetRunLevel(ScsiIntLevel) else SaveLevel := 100; {larger than the largest interupt level} if SessionState = SessionRunning then begin ISRError := TRUE; StartState(Pt     n begin ResultCode := ORD(NoEvent); with PtrSessionBlock^ do begin SessionStatus := xfer_code; ResidualCount := InternalBlock.XferBlock.XferBufBlock.BufLen; end; end else begin ResultCode := ORD(ScsiErr); * * Functional Description: * * Determine the state machine error type and log it appropirately in * the session block. * * On Output: NoEvent * * *************************************************************************} Procedure Cm utlSetInternalErr(PtrSessionBlock, ScsiXferErr); end; end; {************************************************************************* * CmdTerminateSession ************************************************************************* * * On IdStateErr(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin utlSetInternalErr(PtrSessionBlock, StateMachineErr); ResultCode := Ord(NoEvent); end; {************************************************************************* * CmdPhaseErrSessionBlock); end; { reset interrupt level } if SaveLevel < ScsiIntLevel then osdSetRunLevel(SaveLevel); end; end; {************************************************************************* * DoReset ********************************nput: The session is to be properly terminated. * * * Functional Description: * * Terminate the session by setting it to complete and taking it out * of the select code block. If a call back routine is to be called, * do it now. ***************************************** * * On Input: Nothing is known. * * * Functional Description: * * Verify the select code is indeed a SCSI select code and then * reset the select code and the bus. * * On Output: * *************** * Look in the select code block for sessions that are waiting to be * started. * * On Output: NoEvent * * *************************************************************************} Procedure CmdTerminateSession(PtrSessionBlock:PtrSessi***********************************************************} Procedure DoReset(SelectCode:S_TYPE_ISC); begin if osdGetScBlock(SelectCode) <> NIL then begin cmdSCUnlinkAllSessions(SelectCode); hwiSCHardReset(SelectCode); end; end; {*****************onBlockType; Var ResultCode:S_SHORT); var Idx:integer; Done:boolean; locpSB:PtrSessionBlockType; begin ResultCode := ORD(NoEvent); with PtrSessionBlock^, InternalBlock, pScBlock^ do begin if (CallBackLoaded) then call(SessionCompleteCallBack, Pt******************************************************** * CmdGetStatus ************************************************************************* * * On Input: Bus is in Status Phase * * * Functional Description: * * Get the status from trSessionBlock); SessionState := SessionComplete; DeviceSessionPtrs[Device] := NextSession; Idx := Device; Done := FALSE; while not Done do begin if Idx = 7 then Idx := 0 else Idx := Idx + 1; locpSB := DeviceSessionPtrs[Idx]; he target and set it in the SessionStatus * variable in the session block. * * This routine will also set the ResidualCount to what is in the * XferBlock. * * On Output: NoEvent or ScsiErr if xfer error has occured. * * ********** if (locpSB <> Nil) and (locpSB^.SessionState = SessionWaiting) then begin Done := TRUE; StartState(locpSB); end else if Idx = Device then Done := TRUE; end; end; end; {***************************************************************************************************************************} Procedure CmdGetStatus(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var xfer_code : s_byte; begin if hwiManXfer(PtrSessionBlock,xfer_code,status_phase,false,false) the************* * CmdStateErr ************************************************************************* * * On Input: The state machine has detected an internal error type of * no event found in event/nextstate list or escape error. *      r ************************************************************************* * * On Input: The current bus phase is not anticipated. * * * Functional Description: * * Set internal error to bus phase error * * * * * On Output: NoEvent  BusFree,state_11 * MsgIn,state_11 * MsgOut,state_11 * DataPhase,state_11 ******************************************************* *state_4 mcall * DoTransfer *$event_pairs *  * * *************************************************************************} Procedure CmdPhaseErr(PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin utlSetInternalErr(PtrSessionBlock, ScsiPhaseErr); ResultCode := Ord(NoEvent); end;DataPhase,state_5 * StatusPhase,state_6 * ScsiErr,state_12 * BusBusy,state_11 * CmdPhase,state_11 * BusFree,state_11 * MsgIn,state_11 * MsgOut,state_11 ****** {************************************************************************* * CmdUnlinkAllSessions ************************************************************************* * * On Input: State Machine is handling a catastrophic error. * * * Fun************************************************* *state_5 mcall * DoTransfer *$event_pairs * StatusPhase,state_6 * ScsiErr,state_12 * BusBusy,state_11 * CmdPhase,state_11 * ctional Description: * * Unlink all sessions by call cmdScUnlinkAllSessions * * On Output: NoEvent * * *************************************************************************} Procedure CmdUnlinkAllSessions(PtrSessionBlock:PtrSessionBlockTy DataPhase,state_11 * BusFree,state_11 * MsgIn,state_11 * MsgOut,state_11 ******************************************************* *state_6 standard * COMMANDS_cmdGetStatus * pe; Var ResultCode:S_SHORT); begin cmdSCUnlinkAllSessions(PtrSessionBlock^.SelectCode); ResultCode := Ord(NoEvent); end; end;  HWI_UTILS_hwiGetPhase *$event_pairs * MsgIn,state_7 * ScsiErr,state_12 * DataPhase,state_11 * StatusPhase,state_11 * BusBusy,state_11 * CmdPhase,state_11 *  INCLUDE ST_EQU *$machine_name SCSI_DRIVER *$global_recover state_10 ******************************************************* *state_1 standard * HWI_UTILS_hwiGetPhase *$event_pairs * BusFree,state_3 * BusBus BusFree,state_11 * MsgOut,state_11 ******************************************************* *state_7 mcall * TerminatePath *$event_pairs * BusFree,state_8 * ScsiErr,state_12 * Msgy,state_2 * ScsiErr,state_12 ******************************************************* *state_2 standard * MESSAGES_msgWaitTimeOrFree *$event_pairs * BusFree,state_3 * ScsiErr,state_12 **********In,state_11 * CmdPhase,state_11 * DataPhase,state_11 * StatusPhase,state_11 * BusBusy,state_11 * MsgOut,state_11 ******************************************************* *state_8 s********************************************* *state_3 mcall * EstablishPath *$event_pairs * CmdPhase,state_4 * BusBusy,state_2 * StatusPhase,state_6 * ScsiErr,state_12 * tandard * COMMANDS_cmdTerminateSession *$event_pairs_catch * state_exit ******************************************************* *state_10 standard * COMMANDS_cmdStateErr *$event_pairs_catch * st     ES_MSGWAITTIMEORFREE REFA HWI_UTILS_HWIGETPHASE LMODE HWI_UTILS_HWIGETPHASE STANDARD equ 0 MCALL equ 1 MEXIT equ 2 SUSPEND equ 3 DONE_EXIT equ 4 SINGLES equ 0 SINGLES_CATCH equ 1 PAIRS equ 2 PAIRS_CATCH equ 3 DEF SCSI_DRIVER SCSI_DRIVER dc.w TANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_12-SCSI_DRIVER dc.l COMMANDS_CMDPHASEERR STATE_5 dc.b MCALL,PAIRS dc.b 8,1 dc.w STATUSPHASE,STATE_6-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.w BUSBUSY,STATE_11- STATE_10-SCSI_DRIVER STATE_1 dc.b STANDARD,PAIRS dc.b 3,1 dc.w BUSFREE,STATE_3-SCSI_DRIVER dc.w BUSBUSY,STATE_2-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.l HWI_UTILS_HWIGETPHASE STATE_3 dc.b MCALL,PAIRS SCSI_DRIVER dc.w CMDPHASE,STATE_11-SCSI_DRIVER dc.w DATAPHASE,STATE_11-SCSI_DRIVER dc.w BUSFREE,STATE_11-SCSI_DRIVER dc.w MSGIN,STATE_11-SCSI_DRIVER dc.w MSGOUT,STATE_11-SCSI_DRIVER dc.l DOTRANSFER STATE_7 dc.b MCALL,ate_12 ******************************************************* *state_11 standard * COMMANDS_cmdPhaseErr *$event_pairs_catch * state_12 ******************************************************* *state_12 mcall *  dc.b 8,1 dc.w CMDPHASE,STATE_4-SCSI_DRIVER dc.w BUSBUSY,STATE_2-SCSI_DRIVER dc.w STATUSPHASE,STATE_6-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.w BUSFREE,STATE_11-SCSI_DRIVER dc.w MSGIN,STATE_11-SCSI_DRIVER dc.w  AbortPath *$event_pairs_catch * BusFree,state_13 * BusBusy,state_13 * state_14 ******************************************************* *state_13 standard * COMMANDS_cmdTerminateSession * MSGOUT,STATE_11-SCSI_DRIVER dc.w DATAPHASE,STATE_11-SCSI_DRIVER dc.l ESTABLISHPATH STATE_2 dc.b STANDARD,PAIRS dc.b 2,1 dc.w BUSFREE,STATE_3-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.l MESSAGES_MSGWAITTIMEORFREE$event_pairs_catch * state_exit ******************************************************* *state_14 standard * HWI_UTILS_hwiHardReset * COMMANDS_cmdUnlinkAllSessions *$event_pairs_catch * state_ex STATE_12 dc.b MCALL,PAIRS_CATCH dc.b 3,1 dc.w BUSFREE,STATE_13-SCSI_DRIVER dc.w BUSBUSY,STATE_13-SCSI_DRIVER dc.w 000,STATE_14-SCSI_DRIVER dc.l ABORTPATH STATE_4 dc.b MCALL,PAIRS dc.b 8,1 dc.w DATAPHAit ******************************************************* *state_exit mexit * 0 ******************************************************* *$end_machine REFA COMMANDS_CMDUNLINKALLSESSIONS LMODE COMMANDS_CMDUNLINKALLSESSIONS REFA HWISE,STATE_5-SCSI_DRIVER dc.w STATUSPHASE,STATE_6-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.w BUSBUSY,STATE_11-SCSI_DRIVER dc.w CMDPHASE,STATE_11-SCSI_DRIVER dc.w BUSFREE,STATE_11-SCSI_DRIVER dc.w MSGIN,STATE_11-SCSI_DRIV_UTILS_HWIHARDRESET LMODE HWI_UTILS_HWIHARDRESET REFA ABORTPATH LMODE ABORTPATH REFA COMMANDS_CMDPHASEERR LMODE COMMANDS_CMDPHASEERR REFA COMMANDS_CMDSTATEERR LMODE COMMANDS_CMDSTATEERR REFA COMMANDS_CMDTERMINATESESSION LMODE COMMANDSER dc.w MSGOUT,STATE_11-SCSI_DRIVER dc.l DOTRANSFER STATE_6 dc.b STANDARD,PAIRS dc.b 8,2 dc.w MSGIN,STATE_7-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.w DATAPHASE,STATE_11-SCSI_DRIVER dc.w STATUSPHASE,STATE_CMDTERMINATESESSION REFA TERMINATEPATH LMODE TERMINATEPATH REFA COMMANDS_CMDGETSTATUS LMODE COMMANDS_CMDGETSTATUS REFA DOTRANSFER LMODE DOTRANSFER REFA ESTABLISHPATH LMODE ESTABLISHPATH REFA MESSAGES_MSGWAITTIMEORFREE LMODE MESSAG_11-SCSI_DRIVER dc.w BUSBUSY,STATE_11-SCSI_DRIVER dc.w CMDPHASE,STATE_11-SCSI_DRIVER dc.w BUSFREE,STATE_11-SCSI_DRIVER dc.w MSGOUT,STATE_11-SCSI_DRIVER dc.l COMMANDS_CMDGETSTATUS dc.l HWI_UTILS_HWIGETPHASE STATE_11 dc.b S     PAIRS dc.b 8,1 dc.w BUSFREE,STATE_8-SCSI_DRIVER dc.w SCSIERR,STATE_12-SCSI_DRIVER dc.w MSGIN,STATE_11-SCSI_DRIVER dc.w CMDPHASE,STATE_11-SCSI_DRIVER dc.w DATAPHASE,STATE_11-SCSI_DRIVER dc.w STATUSPHASE,STATE_11-SCSI_DRIVEnchParms (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgTargetSynchParms (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgGetMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCodR dc.w BUSBUSY,STATE_11-SCSI_DRIVER dc.w MSGOUT,STATE_11-SCSI_DRIVER dc.l TERMINATEPATH STATE_8 dc.b STANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_EXIT-SCSI_DRIVER dc.l COMMANDS_CMDTERMINATESESSION STATE_EXIT dc.b e:S_SHORT); Procedure MsgRejectMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgSetXfer (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgDoXfer (PtrSessionBlock:Pt MEXIT,SINGLES dc.w 0 STATE_10 dc.b STANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_12-SCSI_DRIVER dc.l COMMANDS_CMDSTATEERR STATE_13 dc.b STANDARD,PAIRS_CATCH dc.b 1,1 dc.w 000,STATE_EXIT-SCSI_DRIVER dc.l COMMrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgSawErrMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgPrepareDisc (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgSetDisANDS_CMDTERMINATESESSION STATE_14 dc.b STANDARD,PAIRS_CATCH dc.b 1,2 dc.w 000,STATE_EXIT-SCSI_DRIVER dc.l HWI_UTILS_HWIHARDRESET dc.l COMMANDS_CMDUNLINKALLSESSIONS * state trace table OPTION = TABLE OFF END c (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgPrepareRetry (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgIsOriginalPhase (PtrSessionBlock:PtrSessionBlockType; Var ResultCod{ SCSI Messages Module. Contains the SCSI driver message level interface. This includes all actions as defined by the network level, that is to: 1) set up a path between the host and target, 2) maintain that path (handle comminication, transmie:S_SHORT); Procedure MsgWaitReselect (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgIsPathActive (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgAbortMsg (PtrSessionBlock:Ptssion errors, disconnect/reconnect) 3) terminate the path. The transport (command) level interacts with the network (message) level to set up paths, handle transmission errors, etc. The SCSI Driver is state machine driven. The State MachirSessionBlockType; Var ResultCode:S_SHORT); implement type SynchParmsType = PACKED RECORD SynchExtend:s_byte; SynchLength:s_byte; SynchCode:s_byte; SynchPeriod:s_byte; SynchReqAck:s_byte; END; const SynchParmsConst = SynchParmsType[ Synchne actually makes all of the calls, and the state tables enforce the division of labor (commands/messages) as defined above. } module MESSAGES; import SCSI_DEFS, SCSI_UTILS, HWI_UTILS, OSD_LL; export Procedure MsgWaitTimeOrFree (PtrSessionBlock:PtExtend:1, SynchLength:3, SynchCode:1, SynchPeriod:0, SynchReqAck:8]; type Xlate16vs32Type = array[0..1] of s_byte; PeriodXlateType = array[0..3] of Xlate16vs32Type; const PeriodXlate = PeriodXlateType[ {16bit 32bit} Xlate16vs32Type [rSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgSelect (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgIdentifyMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); Procedure MsgInitSy 125, 62 ], Xlate16vs32Type [ 168, 93 ], Xlate16vs32Type [ 0, 125 ], Xlate16vs32Type [ 0, 0 ] ]; function GetSynchN(PeriodParm:integer):integer; var i:integer; begin { compute from the transfer period parameter, the number      . * Select with the attention line on to indicate that messages are * supported and the MsgOut phase is desired upon successful selection. * * Maintain a count of select attempts and err if count exceeds max. * If select is unsucce ints.cmd_complete then begin { wait for chip to settle down } if (ssts.action <> spc_init_idle) and (ssts.action <> spc_init_wait_xfer) then begin osdStartTimer(one_second); repeat until (ssts.action = spc_init_idlssful, set result code to BusBusy. * * * On Output: WaitForIsr while waiting for a Select. This is the point * where overlap transfer begins and the state machine becomes interrupt * driven. * BusBusy for select fail. * ScsiErr.e) or (ssts.action = spc_init_wait_xfer) or osdTimeExpired; if (ssts.action <> spc_init_idle) and (ssts.action <> spc_init_wait_xfer) then begin ResultCode := ORD(ScsiErr); utlSetInternalErr(PtrSessionBloto be placed in H/W. The number to be placed in hardware is n-1 where n = (4m/125)-1 The PeriodParm is m. Because of rounding when m is generated, 4m needs to be modified to be an exact multiple of 125. } i := PeriodParm * 4; GetSynch * NoEvent if sucessful. * *************************************************************************} Procedure MsgSelect (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var i:integer; begin with PtrSessionBlock^, InterN := ((i + (i mod 125)) Div 125) - 2; end; {************************************************************************* * msgWaitTimeOrFree ************************************************************************* * * On Input: Scsi Bus is busy. * nalBlock.pScBlock^, PtrScsiCard^, PtrScsiChip^ do if not InternalBlock.ISRWaiting then begin i := osdBitLsL(1,Device); if (i = ord(bdid)) then begin utlSetInternalErr(PtrSessionBlock, ScsiAddressErr); ResultCode := ORD(ScsiErr); end else * * Functional Description: * * Wait for either the bus to free up or timeout. * * * * On Output: BusFree, ScsiErr (InternalStatus set to ScsiTimeoutErr). * * *************************************************************************} Proced begin ResultCode := ORD(WaitForISR); InternalBlock.ISRWaiting := True; InternalBlock.ISRMask := cmd_complete + timeout; ints.ints := ints.ints; pctl.pctl := 0; data_regs.temp := chr(osdBitOr(ord(bdid), i)); scmd.cmd := set_atn_cmd; ure MsgWaitTimeOrFree (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin with PtrSessionBlock^.InternalBlock.pScBlock^.PtrScsiChip^ do begin ResultCode := ORD(BusFree); if (ssts.init) then begin osdStartTimer(one_second);  data_regs.tch := chr(hex('0f')); data_regs.tcm := chr(hex('42')); data_regs.tcl := #4; scmd.cmd := select_cmd; sc_reg.ie := true; end; end else {ISR has occured} begin InternalBlock.ISRWaiting := false; sc_reg.ie := false; scmd.cmd repeat until (not ssts.init) or (osdTimeExpired); if (ssts.init) then begin utlSetInternalErr(PtrSessionBlock, ScsiTimeOutErr); ResultCode := ORD(ScsiErr); end; end; end; end; {**************************************************** := reset_atn_cmd; if InternalBlock.ISRError then ResultCode := ORD(ScsiErr) else begin if ints.time_out then begin if InternalBlock.SelectRetryCount >= SelectRetryMax then begin ResultCode := ORD(ScsiErr); utlSetInternalEr********************* * MsgSelect ************************************************************************* * * On Input: bus is in a free state. * * * Functional Description: * * Select the device that this session wants to communicate withr(PtrSessionBlock, SelectRetryErr); DeviceSynchParms[Device].SynchState := NoSynch; end else begin InternalBlock.SelectRetryCount := InternalBlock.SelectRetryCount + 1; ResultCode := ORD(BusBusy); end; end else if     ck, ScsiTimeOutErr); end else ResultCode := ORD(NoEvent); end else ResultCode := ORD(NoEvent); if (psns.t_phase <> msg_out_phase) and (psns.t_phase <> cmd_phase) then begin osdStartTimer(one_seco DevLun := LUN; XferByte := b; MaintainATN := (DeviceSynchParms[Device].SynchState = NeedSynch); if hwiManXfer(PtrSessionBlock, XferByte, msg_out_phase, MaintainATN, false) then begin if MaintainATN then ResultCode := ORD(NeedSynchParms) nd); repeat until (psns.t_phase = msg_out_phase) or (psns.t_phase = cmd_phase) or (osdTimeExpired); end; end; end; ints.ints := ints.ints; end; end; {***************************************************************** else ResultCode := ORD(NoEvent); end else begin utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); ResultCode := ORD(ScsiErr); end; end else begin utlSetInternalErr(PtrSessionBlock, ScsiAddressErr); ResultCode := ORD(ScsiErr); ******** * MsgIdentifyMsg ************************************************************************* * * On Input: Bus is in a MsgOut phase. * * * Functional Description: * * Format and transmit an identify message to the device. * The  end; end; {************************************************************************* * MsgInitSynchParms ************************************************************************* * * On Input: It has been determined that Synchronous transmission *SUN (Seconday Unit Number) parameter is not supported. * Range checking on the LUN value is performed here. * The session parameter 'DoNotDisconnect' determines if disconnect * will be allowed in this session. * * This routine, bef parameters must be set up. The Bus should be in MsgOut phase. * Agreement protocol used begins with initiator. * * Functional Description: * * This routine handles all of the message passing required to agree * with ore sending the identify message, must determine * if synch parameters with this device should be discussed. If this is * the case, maintain the ATN line set during the identify transfer and * set the ResultCode to NeedSynchParms. * * Othe target on synchronous transmission parameters. * * The agreed upon synchronous parameters must be stored in the select * code block. * * * On Output: NoEvent if successful. ScsiErr Otherwise. * Agreed upon synch. parms are in seln Output: NoEvent or NeedSynchParms if successful, otherwise ScsiErr. * *************************************************************************} Procedure MsgIdentifyMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); type Identiect code block. * *************************************************************************} Procedure MsgInitSynchParms (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var SynchParms:SynchParmsType; SynchMsgBuf:SynchParmsType; DMA3fyMsgType = packed record case boolean of true:( IdentifyBit:boolean; AllowDisconnect:boolean; rsrvd:0..7; DevLun:0..7); false:(b:s_byte); end; Var IdentifyData:IdentifyMsgType; XferByte:s_byte; MaintainATN:Boolean; 2BitIdx:integer; XferCode:s_byte; i:integer; pByte:PtrChar; begin with PtrSessionBlock^, InternalBlock.pScBlock^, PtrScsiCard^, PtrScsiChip^, DeviceSynchParms[Device] do begin ResultCode := ord(NoEvent); SynchParms := SynchParmsConst; DMA3begin { Guaranteed to be in msgout phase when this routine is called. } With IdentifyData, PtrSessionBlock^, InternalBlock.pScBlock^, PtrScsiChip^ do if LUN < 8 then begin IdentifyBit := true; AllowDisconnect := not DoNotDisconnect; rsrvd := 0; 2bitIdx := ord( ((osdDMA32bit) and (not id_reg.d16)) ); SynchParms.SynchPeriod := PeriodXlate[config_reg.sync_rate][DMA32bitIdx]; if SynchParms.SynchPeriod = 0 then {current h/w can't synch} begin SynchState := NoSynch; { turn off the attentio     tCode := ord(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); end; { else if the phase has changed, then this is not an error. } end; if (ResultCode = ord(NoEvent)) and (i > 0) then {target's reply is o.k.}se. * * Functional Description: * * This routine handles all of the message passing required to agree * with the target on synchronous transmission parameters. * * The agreed upon synchronous parameters must be stored in the select * begin if (i = 1) and (SynchMsgBuf.SynchExtend = hex('07')) then {message reject} begin SynchState := NoSynch; end else if (i = 5) and (SynchMsgBuf.SynchExtend = hex('01')) and (SynchMsgBuf.SynchCode = he code block. * * On Output: NoEvent if successful. ScsiErr Otherwise. * Agreed upon synch. parms are in select code block. * * *************************************************************************} Procedure MsgTargetSynchParms (PtrSn line } XferCode := hex('08'); {noop message} if not hwiManXfer(PtrSessionBlock,XferCode,msg_out_phase,false,false) then begin ResultCode := ord(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); end else ResultCode :x('01')) then {Synch parms message brought in} begin if (SynchMsgBuf.SynchReqAck = 0) then begin {target says do asynch} SynchState := NoSynch; end else {target negotiated synch parms} begin i := ord(NoEvent); end else {h/w can synch, attempt to synch with device} begin pByte := addr(SynchParms); i := sizeof(SynchParms); XferCode := ord(pByte^); while (psns.t_phase = msg_out_phase) and (i > 0) and (ResultCode == GetSynchN(SynchMsgBuf.SynchPeriod); if (SynchMsgBuf.SynchReqAck <= SynchParms.SynchReqAck) and (SynchMsgBuf.SynchPeriod >= SynchParms.SynchPeriod) and (i < 4) then begin {all parms are o.k.}  ord(NoEvent)) do begin if (hwiManXfer(PtrSessionBlock, XferCode, msg_out_phase, (i>1),false)) then begin pByte := addr(pByte^, 1); XferCode := ord(pByte^); i := i - 1; end else if (psns.t_phase = msg_out_phase SynchState := Synched; TMODvalue.sx := true; TMODvalue.maxto := SynchParms.SynchReqAck MOD 8; TMODvalue.mintp := i; TMODvalue.pad := 0; end else {illegal parms} begin SynchState :) then begin SynchState := NoSynch; ResultCode := ord(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); end; { else if the phase has changed, then this is not an error. } end; if (ResultCode = ord(NoE= NoSynch; MsgRejectMsg(PtrSessionBlock, ResultCode); end; end; end else begin {msg is not what is expected.} SynchState := NoSynch; MsgRejectMsg(PtrSessionBlock, ResultCode); end; end elsevent)) then {synch sent out o.k., now get the target's reply} begin {get the message} pByte := addr(SynchMsgBuf); i := 0; while (psns.t_phase = msg_in_phase) and (ResultCode = ord(NoEvent)) do begin if hwiManXfer(PtrSessionBlock if (i = 0) then {illegal phase} begin SynchState := NoSynch; end; end; end; end; end; {************************************************************************* * MsgTargetSynchParms *************************************************, XferCode, msg_in_phase, (i<4),false) then begin pByte^ := chr(XferCode); pByte := addr(pByte^, 1); i := i + 1; end else if (psns.t_phase = msg_in_phase) then begin SynchState := NoSynch; Resul************************ * * On Input: The target has requested that synchronous parms be set up. * The target's parms are in the select code block. * Agreement protocol used begins with target. * Bus is in MsgOut pha     essionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var SynchParms:SynchParmsType; DMA32BitIdx:integer; XferCode:s_byte; i:integer; N:integer; pByte:PtrChar; begin with PtrSessionBlock^, InternalBlock, pScBlock^, PtrScsiCard^, PtrScsiChi N := GetSynchN(SynchParms.SynchPeriod); end; if (SynchState = NeedSynch) then {send back a valid response to target} begin ResultCode := ord(NoEvent); pByte := addr(SynchParms); i := sizeof(SynchParms); XferCode := ord(pByte^p^, DeviceSynchParms[Device] do begin SynchState := NoSynch; ResultCode := ord(NoEvent); SynchParms := SynchParmsConst; DMA32bitIdx := ord( ((osdDMA32bit) and (not id_reg.d16)) ); SynchParms.SynchPeriod := PeriodXlate[config_reg.sync_rate][DMA32); while (psns.t_phase = msg_out_phase) and (i > 0) and (ResultCode = ord(NoEvent)) do begin if (hwiManXfer(PtrSessionBlock, XferCode, msg_out_phase, (i>1),false)) then begin pByte := addr(pByte^, 1)bitIdx]; if SynchParms.SynchPeriod = 0 then {current h/w can't synch} begin { reject the request } SynchState := NoSynch; MsgRejectMsg(PtrSessionBlock, ResultCode); end else {h/w can synch, attempt to synch with device} begin { N; XferCode := ord(pByte^); i := i - 1; end else begin SynchState := NoSynch; ResultCode := ord(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); end; end; if (ResultCode = ord(NoEvent))ow evaluate and modify the targets req/ack parm as necessary. } if (TargetSynchReqAck = 0) then begin {target is really requesting asynchronous mode!} SynchState := NoSynch; MsgRejectMsg(PtrSessionBlock, ResultCode); end else if  then {all synched!} begin {all parms are o.k., send back } SynchState := Synched; TMODvalue.sx := true; TMODvalue.maxto := SynchParms.SynchReqAck MOD 8; TMODvalue.mintp := N; TMODvalue.pad := 0; end; end; { else(TargetSynchReqAck < SynchParms.SynchReqAck) then begin {Conform to targets ReqAck request} SynchParms.SynchReqAck := TargetSynchReqAck; end; { else, target will be asked to conform to our max by default. } { Evaluate an a Reject Msg has already been sent. } end; end; end; {************************************************************************* * MsgGetMsg ************************************************************************* * * On Input: Bus is in the MsgId modify the targets synch parm as necessary. } if (TargetSynchPeriod > SynchParms.SynchPeriod) then begin { Target's request is less greater than our smallest period, so go with it!. First check if for validity! } N n phase. * * * Functional Description: * * Acquire the incomming message. If the message has data that * needs to be stored for later reference, store in either the * sessionblock or in the select code block. * * If a parity e:= GetSynchN(TargetSynchPeriod); if (N < 4) then {valid synch request} begin {Conform to targets Period request} SynchParms.SynchPeriod := TargetSynchPeriod; end else begin {target is requesting a period impossible for ourror is detected, send the MessageParityError * message and await a retry. * * On Output: Message has been acquired and the message code is set in * the ResultCode. ScsiErr if an error has occured. * **************************************r H/W!} SynchState := NoSynch; MsgRejectMsg(PtrSessionBlock, ResultCode); end; end else begin { ask target to conform to our smallest period. This will occur naturally, however the var N needs to be recomputed. } ***********************************} Procedure MsgGetMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); type XlateMsgType = array [0..12] of S_SHORT; const XlateMsgCode = XlateMsgType[ ORD(CmdComplete),ORD(ScsiErr),ORD(Sav     ) and (not psns.req) then begin osdStartTimer(one_second); repeat until ( (psns.t_phase <> msg_in_phase) or ( (psns.t_phase = msg_in_phase) and (psns.req) ) or (osdTimeExpired) ); if (psns.t_phase = msg_in_phase) andscription: * * Set up the XferBlock which is located in the InternalBlock of the * SessionBlock. * * The XferPhase is the current bus phase. * The XferRetryCount is set to 0. * The XferBlock is set up according to the bus ph (not psns.req) then begin utlSetInternalErr(PtrSessionBlock, ScsiPhaseErr); ResultCode := ord(ScsiErr); end; end; end else if (XferCode = hex('01')) {extended message} and (i = 5) and (ord(Buf[3]) = hex('01')) and {synchronoase: * * CmdPhase: Use the CmdPtr and CmdLen. * DoDMA is always false. * Set up TMOD: if the device has synched, used TMODvalue. * * DataIn or DataOut: Use BufIeDataPtr), ORD(RestorePtrs),ORD(Disconnect),ORD(ScsiErr), ORD(ScsiErr),ORD(ScsiErr),ORD(ScsiErr),ORD(ScsiErr), ORD(LCC),ORD(LCCwFlag),ORD(ScsiErr)]; var Buf:packed array [ 1 .. 5 ] of char; XferCode:s_byte; i : integer; begin with PtrSeus message} (psns.t_phase = msg_out_phase) then {guarantee msgout phase} begin ResultCode := ord(Synch); TargetSynchPeriod := ord(Buf[4]); TargetSynchReqAck := ord(Buf[5]); end else {unknown message} ResultCode := ord(ScsiErr); if ssionBlock^.InternalBlock, pScBlock^.PtrScsiChip^ do begin ResultCode := ord(NoEvent); { read in the message. - special note: if this is a synchronous parms message comming in, then before the last byte is brought in, we have to request ResultCode = ORD(ScsiErr) then utlSetInternalErr(PtrSessionBlock, ScsiBadMsg); end; end; {************************************************************************* * MsgRejectMsg *********************************************************************message out phase for a reply. } i := 0; repeat if hwiManXfer(PtrSessionBlock, XferCode, msg_in_phase, (i<4), ((i = 4) and (ord(buf[3]) = 1))) then begin i := i + 1; Buf[i] := chr(XferCode); end else if (psns.t_pha**** * * On Input: Bus can be in any phase. * * * Functional Description: * * Acquire the MsgOut phase (hwiGetMsgOut) * Format and send a MessageReject Message. * * On Output: NoEvent if successful. ScsiErr otherwise. * *************se = msg_in_phase) then begin ResultCode := ord(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); end; { else if the phase has changed, then this is not an error. } until ( (ResultCode <> ord(NoEvent)) or (psns.t_p************************************************************} Procedure MsgRejectMsg (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var Xfer_Code : s_byte; begin hwiGetMsgOut(PtrSessionBlock,ResultCode); if ResultCode = Ohase <> msg_in_phase) or (Buf[1] <> #1) ); XferCode := ord(Buf[1]); if (i = 1) then {standard 1 byte message} begin if (XferCode div 128) <> 0 then { Identify } ResultCode := ORD(Identify) else if XferCode > hex('0c') then RD(MsgOut) then begin xfer_code:=hex('07'); if hwiManXfer(PtrSessionBlock,xfer_code,msg_out_phase,false,false) then ResultCode := ORD(NoEvent) else begin ResultCode := ORD(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiManXferErr); end;  Resultcode := ord(ScsiErr) else ResultCode := XlateMsgCode[XferCode]; { Wait for a possible phase change - there may be more message bytes. This is determined by the state of the REQ line. } if (psns.t_phase = msg_in_phase end; end; {************************************************************************* * MsgSetXfer ************************************************************************* * * On Input: Bus is in either CmdPhase or DataPhase. * * * Functional De     n or BufOut. * * Set XferSavedDataPointer and XferSavedDateLength equal to BufPtr and BufLen. * * On Output: NoEvent. XferBlock has been set up for a transfer. * ScsiErr. Illegal value in the XferBlock. * ************************** * * * Functional Description: * * Sets up the hardware for a transfer and controls the transfer. * If DoDMA, sets up DMA and waits for an interrupt. * * If an error occurs, this routine handles the error and waits until * the b***********************************************} Procedure MsgSetXfer (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var locTMOD:tmod_type; begin ResultCode := ORD(NoEvent); With PtrSessionBlock^, InternalBlock.XferBlock, Inteus is in message out phase (calls hwiGetMsgOut). * * If the xfer is stopped by the target, this is o.k., however this * routine must see that any untransmitted data that is in the chip/DMA * buffers are cleared out and that the buffer pornalBlock.pScBlock^, DeviceSynchParms[Device] do begin XferPhase := PtrScsiChip^.psns.t_phase; XferRetryCount := 0; case XferPhase of cmd_phase: begin XferBufBlock.BufPtr := CmdPtr; XferBufBlock.BufLen := CmdLen; XferBufBlockinter and length is * set to the next byte to be transferred. * * On Output: ScsiErr if an unrecoverable hardware error occurs. * MsgOut if error occured and bus successfuly moved to MsgOut phase. * NoEvent otherwise. .DoDMA := false; { Before entering data phase, the chip must see the transfer method. } if (SynchState = Synched) then locTMOD.tmod := TMODvalue.tmod else locTMOD.tmod := hex('00'); PtrScsiChip^.tmod.tmod * *************************************************************************} Procedure MsgDoXfer (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin With PtrSessionBlock^, InternalBlock, XferBlock, pScBlock^, PtrScsiChip^ do := locTMOD.tmod; end; data_out_phase: XferBufBlock := BufOut; data_in_phase: XferBufBlock := BufIn; otherwise begin utlSetInternalErr(PtrSessionBlock, ScsiPhaseErr); ResultCode := ORD(ScsiErr); end; end; if (Xfe begin ResultCode := ord(NoEvent); { if not waiting for an ISR, then starting or renewing the transfer defined in the XferBlock. } if NOT ISRWaiting then begin { Is DMA Requested on this buffer block? if so, attempt to get rBufBlock.BufPtr = Nil) or (XferBufBlock.BufLen <= 0) or (XferBufBlock.BufLen > hex('00ffffff')) then begin utlSetInternalErr(PtrSessionBlock, ScsiXferParmErr); ResultCode := ORD(ScsiErr); end else if (odd(ord(XferBufBlock.BufPtr))) oa DMA channel. If one is unavailable, convert this xfer to a programmatic xfer. } if XferBlock.XferBufBlock.DoDMA then begin DMAChannel := osdGetDMAChannel(SelectCode); if DMAChannel = -1 then XferBufBlock.DoDMA:=false; er (odd(XferBufBlock.BufLen)) then XferBufBlock.DoDMA := FALSE; if ResultCode = ORD(NoEvent) then {no errors have occured so far.} begin XferSavedDataPointer := XferBufBlock.BufPtr; XferSavedDataLength := XferBufBlock.BufLen; ennd; { If a DMA channel has been acquired, then start the DMA. Otherwise, this is a programmatic transfer. } if XferBlock.XferBufBlock.DoDMA then begin DMAInProgress := TRUE; if (not hwiStartDMAXfer(PtrSessionBlock)) then d; end; end; {************************************************************************* * MsgDoXfer ************************************************************************* * * On Input: Bus is in correct phase and the XferBlock has been set up.  ResultCode := ord(ScsiErr) else ResultCode := ord(WaitForISR); end else {programmatic xfer} begin if (not hwiProgXfer(PtrSessionBlock)) then ResultCode := Ord(ScsiErr); end; end else {chip interrupt after DMA} begin      On Input: Bus is in MsgOut phase and a transmission error has been * detected during a Command or Data phase. * * Functional Description: * * Send a InitiatorDetectedError message to the target. * Do not raise the ATN line d ResultCode := Ord(NoEvent); end; {************************************************************************* * MsgSetDisc ************************************************************************* * * On Input: A disconnect message has been receiveuring the transfer. * * * On Output: NoEvent if message successfully sent. * ScsiErr otherwise. * *************************************************************************} Procedure MsgSawErrMsg (PtrSessionBlock:PtrSessionBlod. * * * Functional Description: * * wait for disconnect to happen. * turn off disconnect interrupt * Set session state to suspended. * * On Output: BusFree if disconnect occurs, ScsiErr otherwise. * * *************************if (not hwiEndDMAXfer(PtrSessionBlock, ResultCode)) then begin { DMAXfer has completed, but needs to be restarted to complete the overall transfer } DMAInProgress := TRUE; if (not hwiStartDMAXfer(PtrSessionBlock)) then RckType; Var ResultCode:S_SHORT); var xfer_code : s_byte; begin with PtrSessionBlock^.InternalBlock.XferBlock do begin XferRetryCount := XferRetryCount + 1; if XferRetryCount > XferRetryMax then begin ResultCode := ORD(ScsiErr); esultCode := ord(ScsiErr) else ResultCode := ord(WaitForISR); end else begin { DMAXfer has completed, ResultCode contains the state machine result. } osdReleaseDMAChannel(SelectCode); DMAInProgress := FALSE;  utlSetInternalErr(PtrSessionBlock, XferRetryErr); end else begin xfer_code:=hex('05'); if hwiManXfer(PtrSessionBlock,xfer_code,msg_out_phase,false,false) then ResultCode := ORD(NoEvent) else begin ResultCode := ORD(ScsiErr); end; end; if (ResultCode = ord(NoEvent)) and (psns.t_phase = XferPhase) then begin { wait for the peripheral to change to the next phase if the driver has requested the correct amount of data, but the target is expecting more da utlSetInternalErr(PtrSessionBlock, ScsiXferErr); end; end; end; end; {************************************************************************* * MsgPrepareDisc ************************************************************************* *ta (happens if user gives incorrect parms) then could wait forever and the phase will not change. But how long to wait? What if the command were a format command which can take 30 minutes or longer! The phase still wouldn't change  * On Input: A Save Data Pointers message has just been received. * This means that the target is either getting ready to * disconnect or wants to ensure that the transmission done * so far is not lost if an er until the disc has formatted. There is nothing that can be done in this case - PWS will hang. } repeat until (psns.t_phase <> XferPhase) or (ints.ints <> 0); if (psns.t_phase = XferPhase) then begin utlSetInternalErr(PtrSessionBlocror occurs latter on. * * Functional Description: * * Copy the current buffer pointer and length to the save pointer * and length. * * On Output: NoEvent * * *************************************************************************} Pk, ScsiXferErr); ResultCode := Ord(ScsiErr); end; end; end; {with} end; {************************************************************************* * MsgSawErrMsg ************************************************************************* * * rocedure MsgPrepareDisc (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin With PtrSessionBlock^.InternalBlock.XferBlock do begin XferSavedDataPointer := XferBufBlock.BufPtr; XferSavedDataLength := XferBufBlock.BufLen; end;      ************************************************} Procedure MsgSetDisc (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); label 1; begin with PtrSessionBlock^, InternalBlock.pScBlock^.PtrScsiChip^ do begin if not ints.disconnectes original h/w phase. * * * Functional Description: * * obtain the current bus phase (EventType) and compare with what is in the * Xfer block. * * * * * On Output: IsOriginalPhase if match is good, otherwise EventType bus phase. * *d then begin osdStartTimer(one_second); repeat until (ints.disconnected) or osdTimeExpired; if not ints.disconnected then begin utlSetInternalErr(PtrSessionBlock, ScsiTimeOutErr); ResultCode := ORD(ScsiErr); goto 1; end; end; *************************************************************************} Procedure MsgIsOriginalPhase (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); begin hwiGetPhase(PtrSessionBlock, ResultCode); with PtrSessionBlock^.InternalBloc ints.ints := disconnected; { turn off disconnected interrupt } SessionState := SessionSuspended; ResultCode := ORD(BusFree); end; 1: end; {************************************************************************* * MsgPrepareRetry ************k.XferBlock, PtrSessionBlock^.InternalBlock.pScBlock^.PtrScsiChip^ do begin if (ResultCode = ORD(CmdPhase)) and (XferPhase = cmd_phase) then ResultCode := ORD(OriginalPhase) else if (ResultCode = ORD(DataPhase)) then begin if (psns.io) t************************************************************* * * On Input: A RestorePtrs messgae has just been recieved. * This means that the target is recovering from an error * or is returnning from a disconnect. If rehen begin if (XferPhase = data_in_phase) then ResultCode := ORD(OriginalPhase); end else begin if (XferPhase = data_out_phase) then ResultCode := ORD(OriginalPhase); end; end; end; end; {********************************covering from * an error, then when the next transmission occurs, the * transmission will begin from the last time the pointers * were saved (beginning of transfer or save data pointers msg). * * Functional Descr***************************************** * MsgWaitReselect ************************************************************************* * * On Input: The bus is in a bus free state. The target must reselect * this session. It is possiiption: * * Copy the save pointer and length to the buffer pointer and length. * * On Output: NoEvent * * *************************************************************************} Procedure MsgPrepareRetry (PtrSessionBlock:PtrSessionBlble that the reselect has * already occured. * * Functional Description: * * Set up for an interrupt to occur when target reselects this session. * When reselected, set the session state to running, and resets the current transockType; Var ResultCode:S_SHORT); begin With PtrSessionBlock^, InternalBlock, XferBlock, pScBlock^, PtrScsiChip^, DeviceSynchParms[Device] do begin XferBufBlock.BufPtr := XferSavedDataPointer; XferBufBlock.BufLen := XferSavedDataLength; end; fer. * * On Output: ScsiErr if timeout, otherwise NoEvent. * *************************************************************************} Procedure MsgWaitReselect (PtrSessionBlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var xfer_code : s_ResultCode := Ord(NoEvent); end; {************************************************************************* * MsgIsOriginalPhase ************************************************************************* * * On Input: XferBlock in SessionBlock containbyte; locTMOD:tmod_type; begin with PtrSessionBlock^, InternalBlock, pScBlock^, PtrScsiCard^, PtrScsiChip^, DeviceSynchParms[Device] do if (not ISRWaiting) and (not ints.reselected) then begin ResultCode := ORD(WaitForISR); ISRWaiting := True     ype; Var ResultCode:S_SHORT); begin with PtrSessionBlock^, InternalBlock.pScBlock^.PtrScsiChip^ do begin if (SessionState = SessionRunning) and (ssts.init) then ResultCode := ORD(NoEvent) else if psns.bsy then ResultCode := ORD(BusBusy) else 255; s_short = 0..65535; s_short_signed = -32768..32767; PtrS_byte = ^s_byte; PtrChar = ^char; s_TYPE_ISC = 0..31; const trace_size = 1000; { SCSIIF common precedes - do not erase this line as it is used during turn process } {--------------------- ResultCode := ORD(BusFree); end; end; {************************************************************************* * MsgAbortMsg ************************************************************************* * * On Input: bus is in message out phase. *--------------------------------------------------} {State types and constants } {-----------------------------------------------------------------------} const state_stack_size = 10; type EventType = ( ; ISRMask := Reselected; sc_reg.ie := true; end else {ISR has occured or Reselected has already happened} begin sc_reg.ie := false; ints.ints := ints.ints; ISRWaiting := false; SessionState := SessionRunning; { tmod value must be set u * * Functional Description: * * Transfer an AbortMessage to the target. * * * * * On Output: ScsiErr or NoEvent. * * *************************************************************************} Procedure MsgAbortMsg (PtrSessionBp before chip sees data in/out transfer phase. } if (SynchState = Synched) then locTMOD.tmod := TMODvalue.tmod else locTMOD.tmod := hex('00'); tmod.tmod := locTMOD.tmod; ResultCode := ord(MsgIn); if ISRError then ResultCode := ORDlock:PtrSessionBlockType; Var ResultCode:S_SHORT); var xfer_code : s_byte; begin xfer_code:=hex('06'); if hwiManXfer(PtrSessionBlock,xfer_code,msg_out_phase,false,false) then ResultCode := ORD(NoEvent) else begin ResultCode (ScsiErr) else if (psns.t_phase <> msg_in_phase) then begin osdStartTimer(one_second); repeat until ( (psns.t_phase = msg_in_phase) or (osdTimeExpired) ); if (psns.t_phase <> msg_in_phase) then begin utlSetInternalErr(PtrSessionBlock, := ORD(ScsiErr); utlSetInternalErr(PtrSessionBlock, ScsiXferErr); end; end; end; ScsiPhaseErr); ResultCode := ord(ScsiErr); end; end; end; end; {************************************************************************* * MsgIsPathActive ************************************************************************* * * On In{ SCSI definitions SCSI definitions are kept in a separate module... } module SCSI_DEFS; import STATE_PROCS; export {-----------------------------------------------------------------------} {forward pointer definitions. put: Nothing expected * * * Functional Description: * * Checks if the session is currently talking to a device. * If the session is running and the chip is connected, then the * path is active. * * If the path is not active, } {-----------------------------------------------------------------------} type PtrSessionBlockType = ^SessionBlockType; PtrSelectCodeBlockType = ^SelectCodeBlockType; {---------------------------------------------------------------------- return if the bus is busy or free. * * On Output: NoEvent if path is active, BusFree or BusBusy otherwise. * *************************************************************************} Procedure MsgIsPathActive (PtrSessionBlock:PtrSessionBlockT-} {Miscellaneous types and constants. } {-----------------------------------------------------------------------} { SCSIIF common follows - do not erase this line as it is used during turn process } type s_byte = 0 ..       { NOTE: The following event list must match the assembler event list defined in ST_EQU } {Standard events} NoEvent, ScsiErr, WaitForISR, {Bus Phase Events, returned by hwiGetPhase} BusFree, BusBusy, MsgIn, MsgOut, CmdPhase, Datayte; case integer of 1:(no_power : boolean;{ 1= no power to terminators } sync_rate: 0..3; { max syncronus tranfer rate } bd_state : boolean;{ 1= bus drivers messed up } parity : boolean;{ 1= parity selected } dev_addr :Phase, StatusPhase, {Message In Events} Synch, SaveDataPtr, RestorePtrs, Disconnect, CmdComplete, Reject, Identify, LCC, LCCwFlag, {Establish Path} NeedSynchParms, {Do a Transfer} OriginalPhase ); {---------------------------- 0..7); { default bus address stored as 1s compliment } 2:(pal_reset: s_byte);{ write only} end; ScsiCardType = PACKED RECORD id_reg : id_reg_type; sc_reg : sc_reg_type; wrap_reg : wrap_reg_type; { writ-------------------------------------------} {Hardware interface types and constants } {-----------------------------------------------------------------------} type {-------------------------------------------------------e only register } config_reg : config_reg_type; END; PtrScsiCardType = ^ScsiCardType; {-----------------------------------------------------------------------} {Chip Register values. } {-----------------} {Scsi Card interface definitions. } {-----------------------------------------------------------------------} id_reg_type = packed record byte0 : s_byte; case integer of 1:(idb : s_byte); ----------------------------------------------------------------------} type cmd_code = (bus_release_cmd,select_cmd,reset_atn_cmd, set_atn_cmd,transfer_cmd,transfer_pause_cmd, reset_ack_req_cmd,set_ack_req_cmd); phase_code = (data_out_phase,d 2:(rl : boolean; { remote/local } dd : boolean; { differential drivers } d16 : boolean; { 16 bit DMA only } pid : 0..31); 3:(reset : s_byte); end; sc_reg_type = packed record byte2 : s_byte; case integer of ata_in_phase,cmd_phase,status_phase, bus_free_phase,arb_sel_phase,msg_out_phase,msg_in_phase); const { sctl bit data values } reset_disable = HEX('80'); control_reset = HEX('40'); arbit_enable = HEX('10'); parity_enable = HEX('08'); reselect 1:(control : s_byte); {write} 2:(status : s_byte); {read} 3:(ie : boolean;{interupt enable} ir : boolean;{currently generating an interupt} intlevel: 0..3;{card interupt level} dma_32 : boolean;{Select 32 bit dma _enable = HEX('02'); int_enable = HEX('01'); { ints bit data values } selected = HEX('80'); reselected = HEX('40'); disconnected = HEX('20'); cmd_complete = HEX('10'); svc_required = HEX('08'); timeout = HEX('04'); spc_hard_er(default 16)} dma_dir : boolean;{software sets} d_enab_1: boolean;{dma enable channel 1} d_enab_0: boolean);{dma enable channel 0} end; wrap_reg_type = packed record { WRITE ONLY REGISTER } byte4 : s_byte; cr = HEX('02'); reset_cond = HEX('01'); { scmd values } transfer_prgx = HEX('84'); { transfer + prgx } transfer_dmax = HEX('80'); { transfer + dmax } bus_release_scmd = HEX('00'); rst_out = HEX('10'); { rst_out set all others clear } {ssts actiase integer of 1:(wraparound : s_byte); 2:(req : boolean; pad : 0..7; bsy : boolean; msg : boolean; cd : boolean; io : boolean); end; config_reg_type = packed record byte6 : s_bon values } spc_not_connected = hex('0'); spc_waiting_select = hex('2'); spc_target_idle = hex('4'); spc_target_reselect = hex('6'); spc_target_xfer = hex('7'); spc_init_idle = hex('8'); spc_init_wait_xfer      psns : s_byte); 2:(req : boolean; ack : boolean; atn : boolean; sel : boolean; bsy : boolean; msg : boolean; cd : boolean; io : boolean); 3:(sdgc : s_byte); 4:(dummy : 0..31; t_phase : phase_code)-----------------------------------------------------------------} {SCSI SessionBlock types and constants } {-----------------------------------------------------------------------} { SCSIIF common follows - do not erase th; 5:(dummy1 : 0..7; bus_free : 0..3); end; ssts_type = packed record byte44 : s_byte; case integer of 1:(ssts : s_byte); 2:(init : boolean; targ : boolean; busy : boolean; xfer : boolean; is line as it is used during turn process } type ScsiDeviceType = 0 .. 7; InternalErrType = ( NoIntErr, ScsiStackingErr, RunLevelErr, StateMachineErr, ScsiInteruptErr, ScsiAddressErr, SelectRetryErr, ScsiManXferErr, ScsiXferErr, Xfe = hex('9'); spc_init_doing_select = hex('a'); spc_init_xfer = hex('b'); {-----------------------------------------------------------------------} {Scsi Chip interface definitions. } {---------- rst : boolean; tc0 : boolean; dfull: boolean; dempty: boolean); 3:(free : 0..7); { combines init,targ & busy } 4:(action: 0..15); { combines init,targ,busy & xfer } 5:(dummy : 0..3; xfer_state : 0..3); { combines -------------------------------------------------------------} type sctl_type = packed record byte34 : s_byte; case integer of 1:(sctl : s_byte); 2:(rd : boolean; cr : boolean; dm : boolean; ae : booleanbusy & xfer } end; serr_type = packed record byte46 : s_byte; case integer of 1:(serr : s_byte); 2:(scsi_err : boolean; spc_err : boolean; pad : 0..3; tcp_err : boolean; phase_err : boo; pe : boolean; se : boolean; re : boolean; ie : boolean); end; scmd_type = packed record byte36 : s_byte; case integer of 1:(scmd : s_byte); 2:(cmd : cmd_code; rst_out : boolean; ilean; short_p : boolean; offset_err : boolean); end; pctl_type = packed record byte48 : s_byte; case integer of 1:(pctl : s_byte); 2:(bfree_ie: boolean; pad : 0..15; msg_out : boolean; cd_oux : boolean; prgx : boolean; pad : boolean; tmode : boolean); 3:(pad1 : 0..31; tm : 0..7); end; tmod_type = packed record byte38 : s_byte; case integer of 1:(tmod : s_byte); 2:(t : boolean; io_out : boolean); 3:(pad1 : 0..31; t_phase : phase_code); end; data_reg_type = packed record byte50 , mbc , byte52 , dreg , byte54 , temp , sx : boolean; maxto: 0..7; mintp: 0..3; pad : 0..3); end; ints_type = packed record byte40 : s_byte; case integer of 1:(ints : s_byte); 2:(selected : boolean; reselected : boolean; disconnbyte56 , tch , byte58 , tcm , byte60 , tcl : char; end; ScsiChipType = PACKED RECORD byte32 : char; bdid : char; sctl : sctl_type; scmd : scmd_type; ected : boolean; cmd_complete : boolean; svc_required : boolean; time_out : boolean; spc_hard_err : boolean; reset_cond : boolean); end; psns_type = packed record byte42 : s_byte; case integer of 1:( tmod : tmod_type; ints : ints_type; psns : psns_type; ssts : ssts_type; serr : serr_type; pctl : pctl_type; data_regs: data_reg_type; END; PtrScsiChipType = ^ScsiChipType; {------     rRetryErr, ScsiEscapeErr, ScsiPhaseErr, ScsiCatastrophicErr, ScsiBadMsg, ScsiTimeOutErr, ScsiXferParmErr, ScsiMiscErr ); SessionStateType = ( SessionWaiting, {Session is initialized and waiting to be started.} SessionRunni:Boolean; TracePtr:ANYPTR; TraceSize:integer; TraceStuff:ANYPTR; InternalBlock:InternalBlockType; END; { SCSIIF common precedes - do not erase this line as it is used during turn process } {---------------------------------------------ng, {Session running (State Machine is started)} SessionSuspended, {Target disconnected, bus released, awaiting reselection} SessionComplete {Session terminated, either normally or with an err} ); ScsiCallBackType = Procedu--------------------------} {Scsi Select Code Block. Common to PWS/RMB O/Ss. } {-----------------------------------------------------------------------} type SynchStateType = (NeedSynch, NoSynch, Synched); SynchParmType = RECORD re(pSB:PtrSessionBlockType); BufferBlockType = RECORD BufPtr:PtrS_byte; BufLen:integer; DoDMA:Boolean; END; const SelectRetryMax = 0; XferRetryMax = 2; type XferBlockType = RECORD XferPhase:phase_code; {The H/W phase (not event p SynchState:SynchStateType; TMODValue:tmod_type; END; ScsiIsrProcType = Procedure(Sc:s_TYPE_ISC); SelectCodeBlockType = RECORD DeviceSessionPtrs:Array[ScsiDeviceType] of PtrSessionBlockType; DeviceSynchParms:Array[ScsiDeviceType] of Synchhase)} XferRetryCount:s_byte; XferSavedDataPointer:PtrS_byte; XferSavedDataLength:integer; XferDMACount:integer; XferBufBlock:BufferBlockType; END; SysCleanUpProc = Procedure(SelectCode:s_TYPE_ISC); InternalBlockType = RECORD ParmType; PtrScsiCard:PtrScsiCardType; PtrScsiChip:PtrScsiChipType; ScsiIntLevel:s_byte; ScsiSelectCode:s_TYPE_ISC; DMAInProgress:boolean; DMA32bit:boolean; DMAChannel:integer; ScsiIsrProc:ScsiIsrProcType; END; implem NextSession:PtrSessionBlockType; pScBlock:PtrSelectCodeBlockType; CallBackLoaded:BOOLEAN; StateErrCode:s_short_signed; StateErrExt:s_short_signed; ISRWaiting:Boolean; ISRError:Boolean; ISRMask:s_byte; SelectRetryCount:s_bytent end; e; XferBlock:XferBlockType; TargetSynchReqAck:s_byte; TargetSynchPeriod:s_byte; SysCleanUp:SysCleanUpProc; StateControlRec:control_rec; END; SessionBlockType = RECORD {Caller sets before session} SelectCode:s_TYPE_ISC; * * NOTE: The following event list must match the assembler event * list defined in ST_EQU * * Standard events NoEvent equ 00 ScsiErr equ 01 WaitForISR equ 02 * Bus Phase Events, returned by hwiG Device:ScsiDeviceType; LUN:s_byte; SUN:s_byte; Overlap:Boolean; DoNotDisconnect:Boolean; CmdPtr:ANYPTR; CmdLen:s_byte; BufIn:BufferBlockType; BufOut:BufferBlockType; SessionCompleteCallBack:ScsiCallBackType; {set betPhase BusFree equ 03 BusBusy equ 04 MsgIn equ 05 MsgOut equ 06 CmdPhase equ 07 DataPhase equ 08 StatusPhase equ 09 * y SCSI Bus Driver during session} SessionState:SessionStateType; SessionStatus:s_byte; InternalStatus:InternalErrType; ResidualCount: INTEGER; {Internal Use Only} {Trace set by caller} {InternalBlock used by driver} DoTraceMessage In Events Synch equ 10 SaveDataPtr equ 11 RestorePtrs equ 12 Disconnect equ 13 CmdComplete equ 14 Reject equ 15 Identify equ      ***************************************** *state_5 standard * MESSAGES_msgPrepareDisc * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * state_10 **************************************************** *$end_machine ******************************************************* ******************* *state_6 standard * MESSAGES_msgPrepareRetry * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * state_10 ******************************************************* ** match pack * nosyms sprint mname matchstr src module matchstr; src export src src type src stringarg=string[255]; src ttable =packed array[0..0] of 0..255; src src function afterstr(var s1:string; src  16 LCC equ 17 LCCwFlag equ 18 * Establish Path NeedSynchParms equ 19 * Do a Transfer OriginalPhase equ 20 state_7 standard * MESSAGES_msgSetDisc *$event_pairs * BusFree,state_9 * ScsiErr,state_exit ******************************************************* *state_8 standard * MESSAGES_msgReject INCLUDE ST_EQU *$machine_name DoTransfer *$global_recover exec_err ******************************************************* *state_1 standard * MESSAGES_msgSetXfer *$event_pairs_catch * ScsiErr,state_exit * Msg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * ScsiErr,state_exit * state_10 ******************************************************* *state_9 standard * MESSAGEstate_2 ******************************************************* *state_2 standard * MESSAGES_msgDoXfer * HWI_UTILS_hwiGetPhase *$event_pairs_catch * WaitForISR,state_2a * MsgIn,state_4 * S_msgWaitReselect *$event_pairs_catch * WaitForISR,state_9a * MsgIn,state_4 * ScsiErr,state_exit * state_exit ******************************************************* *state_9a suspend *  MsgOut,state_3 * state_exit ******************************************************* *state_2a suspend * state_2 ******************************************************* *state_3 standard * MESSA state_9 ******************************************************* *state_10 standard * MESSAGES_msgIsOriginalPhase *$event_pairs_catch * OriginalPhase,state_2 * state_exit ********************************GES_msgSawErrMsg * HWI_UTILS_hwiGetPhase *$event_pairs_catch * MsgIn,state_4 * state_exit ******************************************************* *state_4 standard * MESSAGES_msgGetMsg *$event_*********************** *state_12 standard * MESSAGES_msgTargetSynchParms * HWI_UTILS_hwiGetPhase *$event_pairs_catch * ScsiErr,state_exit * state_10 ********************************************pairs_catch * SaveDataPtr,state_5 * Identify,state_6 * RestorePtrs,state_6 * Disconnect,state_7 * Synch,state_12 * ScsiErr,state_exit * state_8 ************************* *exec_err standard * COMMANDS_cmdStateErr *$event_pairs_catch * state_exit ******************************************************* *state_exit mexit * 0 ***************************************       c :integer; src n :integer; src s2:stringarg):integer; src function beforestr(var s1:string; src c :integer; src n :integera.w #aargs,sp jmp (a0) * * no count with string * after2 moveq #1,d2 count 1 move.l ac(a6),d3 ble aret cursor out of range? bsr.s scan beq aret must match at least once after3 move.l d3,afunc(a6) moveq #1,d2 reset cou; src s2:stringarg):integer; src function changestr(var s1:string; src c :integer; src n :integer; src s2:stringarg; src nt bsr.s scan bne after3 bra aret * scan equ * subq.l #1,d2 pre decriment count * scan1 movem.l d0-d2/a0-a1,-(sp) save for next call bsr scanloop movem.l (sp)+,d0-d2/a0-a1 beq.s scanx dbra d2,scan1 scanx rts scanloo s3:stringarg):integer; src function breakstr(s1:stringarg; src c :integer; src s2:stringarg):integer; src function spanstr(s1:stringarg; src c :integer; src p equ * sub.l d3,d0 addq.l #1,d0 blt sfexit pos in range ? sub d1,d0 is str2 longer than blt sfexit remaining str1 ? tst.w d1 beq.s ssexit2 str2 is null so match movea.l a0,a2 save str1 ptr adda.w d3,a0 st s2:stringarg):integer; src src function utloctal(s:stringarg): integer; src src end; * * UTLOCTAL added 3/30/87 by jws -- removed dependecy on REALS library * def matchstr_matchstr matchstr_matchstr equ * rts afunc eqart source compare move.b (a1)+,d6 first character subq #2,d1 scl1 cmp.b (a0)+,d6 scl2 dbeq d0,scl1 bne.s sfexit found it ? movea.l a0,a3 temp str1 movea.l a1,a4 temp str2 move.w d1,d5 remaining str2 bytes blt.s u 26 ams1 equ 24 as1 equ 20 ac equ 16 an equ 12 as2 equ 8 aargs equ 18 def matchstr_afterstr dc.w 0 matchstr_afterstr equ * link a6,#0 clr.l afunc(a6) func:=0 movea.l as1(a6),a0 ssexit str2 is 1 char scl3 cmpm.b (a3)+,(a4)+ dbne d5,scl3 bne scl2 ssexit move.l a3,d3 sub.l a2,d3 rts ssexit2 move.l d3,d3 set condition code rts sfexit moveq #0,d3 cursor to zero rts * def matchstr_beforestr dc.w  a0:=^s1 moveq #0,d0 move.b (a0),d0 d0:=strlen(s1) move.l an(a6),d2 if n>=0 blt.s after1 then * * count * move.l ac(a6),d3 d3:=c ble.s aret check cursor<=0 movea.l as2(a6),a1 a1:=^s1 moveq #0,d1 move. 0 matchstr_beforestr equ * link a6,#0 clr.l afunc(a6) func:=0 movea.l as1(a6),a0 a0:=^s1 moveq #0,d0 move.b (a0),d0 d0:=strlen(s1) move.l an(a6),d2 if n>=0 blt.s before1 then * * count * move.l ac(a6),d3b (a1)+,d1 d1:=strlen(s2) beq.s after0 bsr.s scan agood move.l d3,afunc(a6) bra.s aret * * count but no string * after0 add.l d2,d3 c:=c+n sub.l d3,d0 addq.l #1,d0 c :: len(s1)+1 bne agood bra aret *  d3:=c ble aret check cursor<=0 movea.l as2(a6),a1 a1:=^s1 moveq #0,d1 move.b (a1)+,d1 d1:=strlen(s2) beq.s before0 bsr scan beq.s bgood sub.l d1,d3 move to front of match bgood move.l d3,afunc(a6) bra  else * no count given * after1 movea.l as2(a6),a1 moveq #0,d1 move.b (a1)+,d1 bne.s after2 * * no count no string * addq.l #1,d0 func:=d0+1 move.l d0,afunc(a6) aret unlk a6 end movea.l (sp)+,a0 add aret * * count but no string * before0 sub.l d2,d3 c:=c-n ble aret c :: 0 bra bgood * else * no count given * before1 movea.l as2(a6),a1 moveq #0,d1 move.b (a1)+,d1 bne.s before2 * * no count no       unt is zero * insert s3 at cursor nilstr dc.w 0 * make ms2 a dummy nilstring chgzcnt move.l #nilstr,ms2(a6) bsr.s chgflds move.l d4,mf(a6) bra chgret * * no count * chgncnt movea.l ms2(a6),a1 tst.b (a1) beq.s  0 length so match sub d1,d0 is old longer than blt chgbad remaining source ? move.b (a1)+,d6 first character subq #2,d1 chg1 cmp.b (a0)+,d6 chg2 dbeq d0,chg1 bne.s chgret found it ? movea.l a0,a3 temp sourc chgnil1 * no count but has s2 might have s3 * replace all occurences of s2 with s3 bsr.s chgflds move.l d4,mf(a6) beq chgret must change at least one chgncnt1 bsr.s chgflds move.l d4,mf(a6) set func value beq chgret e movea.l a1,a4 temp old move.w d1,d5 remaining old bytes blt.s chgf0 old is 1 char chg3 cmpm.b (a3)+,(a4)+ dbne d5,chg3 bne chg2 chgf0 subq.l #1,a0 chgf1 movea.l ms1(a6),a4 string s move.b d3,(a4) tst.w d0 beqstring * moveq #1,d0 func:=1 move.l d0,afunc(a6) bra aret * * no count with string * before2 moveq #1,d2 count 1 move.l ac(a6),d3 ble aret cursor out of range? bsr scan beq aret must match at least once before bra chgncnt1 * no count no s2 chgnil1 movea.l ms3(a6),a2 tst.b (a2) beq.s chgnil2 * no count only s3 * replace rest of s1 with s3 move.b d4,(a0) chop s1 to cursor subq.b #1,(a0) bra chgzcnt add s3 * * no count no s3 move.l d3,afunc(a6) sub.l d1,afunc(a6) move to front of match moveq #1,d2 reset count bsr scan bne before3 bra aret mf equ 30 ms1m equ 28 ms1 equ 24 mc equ 20 mk equ 16 ms2 equ trings * delete remainder of s1 chgnil2 move.b d4,(a0) set s1 length subq.b #1,(a0) move.l d4,mf(a6) set func value bra chgret * have count no s2 * replace count bytes with s3 chgcnil1 sub.l d5,d0 d0 is #bytes after delet 12 ms3 equ 8 mr equ 22 def matchstr_changestr dc.w 0 matchstr_changestr equ * link a6,#0 clr.l mf(a6) function result 0 move.l mc(a6),d4 cursor ble chgret movea.l ms1(a6),a0 moveq #0,d0 move.b (a0e blt chgret movea.l ms3(a6),a2 addr and size of s3 moveq #0,d2 move.b (a2)+,d2 moveq #0,d3 move.b (a0),d3 will it fit sub d5,d3 add d2,d3 final size of s1 cmp.b ms1m(a6),d3 bhi chgret move.l d5,d7 apparent size o),d0 sub.l d4,d0 addq.l #1,d0 blt chgret cursor in range ? move.l mk(a6),d5 counter beq chgzcnt ble chgncnt * have count value movea.l ms2(a6),a1 tst.b (a1) beq chgcnil1 * have count and s2 and maybe s3 f s2 adda d4,a0 cursor addr lea 0(a0,d5.w),a3 after delete bsr chgf1 do it move.l d4,mf(a6) bra chgret chgbad moveq #0,d4 cursor to zero rts * * do one change * chgflds movea.l ms1(a6),a0 source string moveq * replace the next n occurences of s2 with s3 bra.s chgl2 chgl1 movem.l d5,-(sp) save count bsr chgflds movem.l (sp)+,d5 get count move.l d4,mf(a6) set func beq chgret chgl2 dbra d5,chgl1 bra chgret * #0,d0 move.b (a0),d0 s length move.l d0,d3 final length of s sub.l d4,d0 addq.l #1,d0 blt chgbad pos in range ? movea.l ms2(a6),a1 old string moveq #0,d1 move.b (a1)+,d1 old lenght move.l d1,d7 save it for lat count but no s2 * replace next count chars with s3 moveq #0,d0 move.b (a0),d0 move.l d0,d3 final length of s1 sub.l d5,d3 movea.l ms3(a6),a2 moveq #0,d2 move.b (a2),d2 add.l d2,d3 blt chgret count is too big * coer movea.l ms3(a6),a2 new string moveq #0,d2 move.b (a2)+,d2 new length sub d1,d3 add d2,d3 cmp.b ms1m(a6),d3 will it all fit ? bhi chgbad adda.w d4,a0 start source compare tst.b d1 beq chgins !      chgcpy1 sub.w d2,d7 beq.s chgcpy1 bgt.s chgsml * new string is greater than old lea 1(a4,d3.w),a4 end s + 1 lea 0(a4,d7.w),a3 source subq.w #1,d0 count chgins1 move.b -(a3),-(a4) dbra d0,chgins1 bra.s chgcpy1 chgp0 move.b (a0)+,d2 movea.l a1,a2 copy list addr move.l d1,d3 copy list length sloop1 cmp.b (a2)+,d2 dbeq d3,sloop1 bne bsxit dbra d0,sloop0 bra bsxit ********************************************************************* * *cpy move.b (a2)+,(a0)+ chgcpy1 dbra d2,chgcpy suba.l ms1(a6),a0 move.l a0,d4 new cursor value rts chgret unlk a6 movea.l (sp)+,a0 adda.w #mr,sp jmp (a0) * * new string is smaller than old chgsml equ * movea.l a3,a4  utloctal added 3/30/87 by jws * -- removed dependecy of FILER on REALS library * ********************************************************************* * refa sysglobals def matchstr_utloctal matchstr_utloctal movea.l 4(sp),a0 address of stringsuba.w d7,a4 subq.w #1,d0 chgdel1 move.b (a3)+,(a4)+ dbra d0,chgdel1 bra chgcpy1 chgins equ * movea.l a0,a3 bra chgf1 bf equ 20 bs1 equ 16 bc equ 12 bs2 equ 8 bargs equ 12 def matchst clr.l d0 result move.b (a0)+,d2 length of string beq.s error {sb} oct@l1 clr.l d1 move.b (a0)+,d1 cmpi.b #32,d1 ord(' ') = 32 bne.s oct@l2 subq.b #1,d2 bgt.s oct@l1 bra.s error {sbr_breakstr dc.w 0 matchstr_breakstr equ * link a6,#0 clr.l bf(a6) set func to 0 move.l bc(a6),d4 cursor pos ble.s bsret movea.l bs1(a6),a0 movea.l a0,a4 save addr of s1 moveq #0,d0 move.b (a0),d0 length } oct@l5 clr.l d1 move.b (a0)+,d1 oct@l2 subi.w #48,d1 ord('0') = 48 blt.s tstblk cmpi.w #7,d1 bgt.s error move.l d0,d3 andi.l #$E0000000,d3 bne.s error asl.l #3,d0 add.l d1,d0 subq.b #1,d2 bgt.s oct@l5 oct@l4 movs1 beq.s bsret sub.l d4,d0 blt.s bsret movea.l bs2(a6),a1 list addr moveq #0,d1 move.b (a1)+,d1 list length beq.s bsret adda.l d4,a0 start scan subq.w #1,d1 bloop0 move.b (a0)+,d2 char to test movea.l a1,a2 ce.l d0,8(sp) put function result on the stack move.l (sp)+,(sp) move the return address up rts tstblk addi.w #48,d1 tstblk0 cmpi.b #32,d1 test for trailing blanks bne.s error subq.b #1,d2 ble.s oct@l4 move.b (a0)+,d1 bra.s tstblkopy list addr move.w d1,d3 copy list length bloop1 cmp.b (a2)+,d2 dbeq d3,bloop1 beq.s bsxit dbra d0,bloop0 bra.s bsret bsxit suba.l a4,a0 calc func value subq.l #1,a0 move.l a0,bf(a6) bsret unlk a6 movea.l (sp)+,a0 0 error move.w #-8,sysglobals-2(a5) trap #10 value range error end  adda.w #bargs,sp jmp (a0) def matchstr_spanstr dc.w 0 matchstr_spanstr equ * link a6,#0 clr.l bf(a6) zero function value move.l bc(a6),d4 cursor position ble.s bsret movea.l bs1(a6),a0 string addr movea.l a************************************ * SCSI Driver - Build Stream File * ************************************ * Need MAKER, which requires MATCHSTR aMATCHSTR n cMAKER n liMAKER oMAKER laiMATCHSTR alkq frMACHINE= q X MAKER ST_SD.TEXT MACHINE1.UX TABLE 0,a4 moveq #0,d0 move.b (a0),d0 string length beq.s bsret sub.l d4,d0 blt.s bsret movea.l bs2(a6),a1 list addr moveq #0,d1 move.b (a1)+,d1 list length beq.s bsret adda.l d4,a0 start scan subq.w #1,d1 slooOFF X MAKER ST_EP.TEXT MACHINE2.UX TABLE OFF X MAKER ST_XFER.TEXT MACHINE3.UX TABLE OFF X MAKER ST_TP.TEXT MACHINE4.UX TABLE OFF X MAKER ST_AP.TEXT MACHINE5.UX TABLE OFF A MACHINE1.UX. N MACHINE1.CODE A MACHINE2.UX. N MACHINE2.CODE A MACHINE3.UX. N !     G SCSIDVR AND SCSIDISC (DON'T LINK SCSILIB) ***** ************************************************************** recp; ref_list : ref_list_recp; refs_on : boolean; current_option: option_type; procedure error(n:integer); var x : integer; var es1 : string[80]; begin es1 := ''; case n of -1: es1 := 'empty file'; 0:$MODCAL$ $DEBUG ON$ PROGRAM MACHINE_MAKER(INPUT,OUTPUT); {local search{} $SEARCH 'MATCHSTR'$ {system search{{ $SEARCH 'PROGS:MATCHSTR'$ {} IMPORT SYSGLOBALS,MATCHSTR; CONST version = 'machine maker version 4.0'; max_name_size = 16; TYPE name_type =  es1 := 'unexpected EOF'; 1: es1 := 'invalid state definition'; 2: es1 := 'invalid state name'; 3: es1 := 'duplicate state definition'+current_state^.name;; 4: es1 := 'require only one exit code for state '+current_state^.name; MACHINE3.CODE A MACHINE4.UX. N MACHINE4.CODE A MACHINE5.UX. N MACHINE5.CODE a OSD_LLA n a HWIA_UTIL n c PWS_SCSI n LOSCSIDVR. LDNSCSIDVR IPWS_SCSI AIOSD_LLA AIHWIA_UTIL AIMACHINE1 AIMACHINE2 AIMACHINE3 AIMACHINE4 AIMACHINE5 ALKQ F RMACHINE1.CODE RMAstring[max_name_size]; proc_name_type = string80; pnamep = ^proc_name_type; ref_list_recp = ^ref_list_rec; ref_list_rec = record pname: pnamep; next : ref_list_recp; end; proc_recp = ^proc_reCHINE2.CODE RMACHINE3.CODE RMACHINE4.CODE RMACHINE5.CODE CMACHINE1.UX,MACHINE1.TEXT CMACHINE2.UX,MACHINE2.TEXT CMACHINE3.UX,MACHINE3.TEXT CMACHINE4.UX,MACHINE4.TEXT CMACHINE5.UX,MACHINE5.TEXT Q ***************************** * CREATE SCSILIB * c; proc_rec = record pname : proc_name_type; next : proc_recp; end; exit_class_type = (singles,singles_catch,pairs,pairs_catch); exit_recp = ^exit_rec; exit_rec = record event : name_type* Add appropriate defs to * * scsiif * ***************************** ESCSIIF FL/SCSIIF common/ SM1 FLSÿ? I ÿCJM1 ZQSE ESCSI_DEFS I ÿCFL/SCSIIF common/ I ÿCJB ZFLSÿ? SM1 FLSFLS I ÿCJM1 ZFLSÿ? I ÿCJE ZQWJUNK EESCSIIF FL/SCSIIF common/ CF; ename : name_type; next : exit_recp; end; state_class_type = (standard,mcall,mexit,suspend,done_exit); state_recp = ^state_rec; state_rec = record name : name_type; statJUNK FL/const/FLSÿ? SM1 FL/SessionBlockType = RECORD/ÿ?I ÿCJM1 ZFL/InternalBlock:/D ÿHÿCIPACKED ARRAY [1..128] of CHAR;ÿC JBFL/SCSIIF common/ FL/type/FLS IPtrSessionBlockType = ^SessionBlockType; ÿcQSE FRJUNK.TEXT Q c SCSIIF n SCSILIB. ****************e_class : state_class_type; nprocs : integer; procs_list : proc_recp; exit_class : exit_class_type; nexits : integer; exit_list : exit_recp; next : state_recp; ************* * SCSI Disk TM * ***************************** c scsidisk n loSCSIDISC. lnSCSIDISC iscsidisk aiSCSILIB. alkq ***************************** * DONE WITH MAKE_SCSI * ***************************** lh1 oSCSIDVR. lnSCSIDVR x Cop end; option_type = (none,module_name, event_singles,event_singles_catch, event_pairs,event_pairs_catch, machine_name,global_recover,end_machine); VAR sname, modname : string255; sfileyright Hewlett-Packard Co.,1985,1993 All rights reserved. iSCSIDVR. alkq lh1 oSCSIDISC. lnSCSIDISC x Copyright Hewlett-Packard Co.,1985,1993 All rights reserved. iSCSIDISC. alkq ************************************************************** * DONE LINKIN, mfile : text; sline : string255; all_done : boolean; ecode : integer; {-----------------------} mod_name : string80; m_name : string80; { machine_name } g_recover : name_type; state_list, last_state, current_state : state_"      5: es1 := 'invalid state class : '+sline; 6: es1 := 'require only one state reference for state '+current_state^.name; 7: es1 := 'require only one machine reference for state '+current_state^.name; 8: es1 := 'invalid option : '+sline;  global_recover: begin i := spanstr(sline,i,' '); j := breakstr(sline,i,' '); if j = 0 then j := strlen(sline)+1; g_recover := str(sline,i,j-i); done  9: es1 := 'global recover state '+g_recover+' not defined '; 10: strwrite(es1,1,x,'invalid exit class : ',current_option, ' for state ',current_state^.name); otherwise strwrite(es1,1,x,'Error ',n:1); := true; end; end_machine: begin all_done := true; done := true; end; otherwise done := true; end; {case option} end end; { case } writeln(mfile,'->->',es1); escape(0); end; procedure upper_case(var s:string); var i : integer; begin for i := 1 to strlen(s) do if s[i] in ['a'..'z'] then s[i] := chr(ord(s[i])-ord('a')+ord('A'));  else if sline[1]<>'*' then done := true; end; end; get_sline := done; end;{ get_sline } procedure add_to_reflist(var p:proc_name_type); var temp : ref_list_recp; found: boolean; begin  end; { upper_case } function get_sline:boolean; var done : boolean; i,j : integer; begin done := false; while not done do begin current_option := none; if eof(sfile) then error(0); readln(s temp := ref_list; found := false; while (not found) and (temp<>nil) do begin if temp^.pname^=p then found := true else temp := temp^.next; end; if not found then begin new(tempfile,sline); sline := strrtrim(sline); writeln(mfile,sline); if sline<>'' then if sline[1]='*' then begin strdelete(sline,1,1); upper_case(sline); if strlen(sline)>1 then if ); with temp^ do begin pname := addr(p); next := ref_list; ref_list := temp; end; end; end; { add_to_reflist} function find_state(var n:name_type):state_recp; var found : booleansline[1]='$' then begin i := 2; try strread(sline,i,i,current_option); recover error(8); case current_option of module_name: begin ; temp : state_recp; begin temp := state_list; found := false; while (not found) and (temp<>nil) do with temp^ do begin if n=name then found := true else temp := next; end; find i := spanstr(sline,i,' '); j := breakstr(sline,i,' '); if j = 0 then j := strlen(sline)+1; mod_name := str(sline,i,j-i); end; machine_name: begin _state := temp; end; { find_state } procedure make_state(var n:name_type); begin current_state := find_state(n); if current_state<>nil then begin if current_state^.procs_list<>nil then error(3); end else  i := spanstr(sline,i,' '); j := breakstr(sline,i,' '); if j = 0 then j := strlen(sline)+1; m_name := str(sline,i,j-i); done := true; end;  begin { create a state with default values } new(current_state); with current_state^ do begin next := nil; name := n; state_class:= standard; nprocs := 0; procs_li"     last^.next := x; last := x; end; { add_state_proc } procedure get_state_procs; var scanning : boolean; last : proc_recp; begin scanning := true; last := nil; while scanning do begin if ge_option of event_singles : exit_class := singles; event_singles_catch:exit_class := singles_catch; event_pairs : exit_class := pairs; event_pairs_catch : exit_class := pairs_catch; otherwise error(10); t_sline then scanning := sline[1]=' ' else scanning := false; if scanning then add_state_proc(last,scanning); end; end; { get_state_proc } procedure add_exit_state(var last:exit_recp); var x : exit_recend; while scanning do begin if get_sline then scanning := sline[1]=' ' else scanning := false; if scanning then add_exit_state(last); end; end; { get_state_exits } procedure do_state; begist := nil; exit_class := singles; nexits := 0; exit_list := nil; end; if last_state=nil then state_list := current_state else last_state^.next := current_state; last_statep; s,e : integer; temp : state_recp; have_event : boolean; begin s := spanstr(sline,1,' '); e := breakstr(sline,s,' ,'); if e = 0 then e := strlen(sline)+1; new(x); with x^ do begin if curr := current_state; end; end; { make_state } procedure get_state_name; var sname : name_type; l : integer; begin all_done := current_option=end_machine; if not all_done then begin l := breakstr(ent_state^.exit_class in [pairs,pairs_catch] then begin event := str(sline,s,e-s); have_event := e<=strlen(sline); if have_event then have_event := sline[e]=','; if have_event then begin sline,1,' '); if l = 0 then l := strlen(sline)+1; if (l>=strlen(sline)) then error(1); if (l>max_name_size) then error(2); sname := str(sline,1,l-1); make_state(sname); try strread(sline,l,l, s := breakstr(sline,e,',')+1; s := spanstr(sline,s,' '); e := breakstr(sline,s,' '); if e = 0 then e := strlen(sline)+1; ename := str(sline,s,e-s); end else { no event field } bcurrent_state^.state_class); recover error(5); end; end; { get_state_name } procedure add_state_proc(var last:proc_recp; var scanning : boolean); var x : proc_recp; s,e : integer; beegin ename := event; event := '000'; end; end else ename := str(sline,s,e-s); next := nil; temp := find_state(ename); if temp=nil then begin temp := current_stategin s := spanstr(sline,1,' '); e := breakstr(sline,s,' '); if e = 0 then e := strlen(sline)+1; new(x); with x^ do begin pname := str(sline,s,e-s); if refs_on then begin pname := mod_name; make_state(ename); current_state := temp; end; with current_state^ do begin nexits := nexits + 1; end; end; if last=nil then current_state^.exit_list := x else la + pname; add_to_reflist(pname); end; next := nil; with current_state^ do begin nprocs := nprocs + 1; end; end; if last=nil then current_state^.procs_list := x else st^.next := x; last := x; end; { add_exit_state } procedure get_state_exits; var scanning : boolean; last : exit_recp; begin scanning := true; last := nil; with current_state^ do case current#     n get_state_name; if not all_done then with current_state^ do begin case state_class of standard: begin get_state_procs; get_state_exits; end; mith tstate^ do begin write(mfile,name,' ':15-strlen(name)); writeln(mfile,' dc.b ',state_class,',',exit_class); case state_class of standard, mcall: begin if nprocs=0 then bcall: begin get_state_procs; { only 1 machine name } if nprocs<>1 then error(7); get_state_exits; end; suspend: begin current_option := event_singles;egin writeln('No procedures for state ',name); escape(0); end; if nexits=0 then begin writeln('No exits defined for state ',name); escape(0); end;  get_state_exits; if nexits<>1 then error(6); end; mexit, done_exit: begin refs_on := false; get_state_procs; { only 1 value }  {if exit_class in [singles_catch,pairs_catch] then nexits := nexits - 1;} writeln(mfile,' ':15,' dc.b ',nexits:1,',',nprocs:1); xlist := exit_list; while xlist<>nil do with xlist^ do beg if nprocs<>1 then error(4); refs_on := true; end; otherwise writeln('un implemented state class', state_class); escape(0); end; { state_class } end; end; { do_state } procin if exit_class in [pairs,pairs_catch] then writeln(mfile,' ':15,' dc.w ',event,',',ename,'-',m_name) else writeln(mfile,' ':15,' dc.w ',ename,'-',m_name); xlist := next; edure generate_machine; var tstate : state_recp; xlist : exit_recp; plist : proc_recp; rlist : ref_list_recp; sc1 : state_class_type; sc2 : exit_class_type; option : string[80]; begin { gener end; plist := procs_list; while plist<>nil do with plist^ do begin writeln(mfile,' ':15,' dc.l ',pname); plist := plist^.next; end; end; suspeate REFA, LMODE list } if find_state(g_recover)=nil then error(9); rlist := ref_list; while rlist<>nil do with rlist^ do begin writeln(mfile,' ':15,' REFA ',pname^); writeln(mfile,' ':15,' LMODE ',pname^); nd: begin with exit_list^ do begin writeln(mfile,' ':15,' dc.w ',ename,'-',m_name); end; end; mexit, done_exit: begin with procs_list^ do  rlist := next; end; { generate state machine definition } for sc1 := standard to done_exit do begin writeln(mfile,sc1,' equ ',ord(sc1):1); end; for sc2 := singles to pairs_catch do begin writel begin writeln(mfile,' ':15,' dc.w ',pname); end; end; otherwise end; { case state_class } writeln(mfile); tstate := tstate^.next; end; writeln(mfile); readln(optin(mfile,sc2,' equ ',ord(sc2):1); end; writeln(mfile); writeln(mfile,' ':15,' DEF ',m_name); writeln(mfile,m_name,' ':15-strlen(m_name),' dc.w ',g_recover,'-',m_name); tstate := state_list; while tstate<>nil do won); option := strltrim(strrtrim(option)); writeln(mfile,'* state trace table OPTION = ',option); if option = 'TABLE ON' then begin writeln(mfile,' DEF ',m_name+'_T'); writeln(mfile,m_name+'_T equ * '); tstate :#     ); if ecode<>0 then escape(ecode); END. FSFS_FSEEK FS_FWRITECHAR FS_FWRITEINT FS_FWRITELN FS_FWRITEPAOC FS_FWRITESTRFS_FWRITESTRCHARFS_FWRITESTRINTFS_FWRITESTRWORD FS_FWRITEWORD FS_SCANTITLE FS_SUFFIXLDR_LDR LOADER_LOADERMFS_FWRITEREAL MISC_MISCSYSDEVSSYSCOMP2:MÙ·Ê:DEVÙGLOBALS"·Êsglobals; export const crevid = daterec[year:91,day:28,month:10]; crevnmY MAINBODY.TEXTT= 'Pascal'; {title} copyright1 = 'Copyright Hewlett-Packard Company, 198DEVS_SYSDATESYSDEVS_SYSDEVSSYSDEVS_SYSTIME SYSGLOBALSSYSGLOBALS_SYSGLOBALS·Ê· L,COPYRIGHT HEWLETT-PACKARD COMPANY 1982, 1990OPENUNITÿ/Òÿ/ÚENTD®DAMÔYRRPÿ0GLOBALSRFÌRRFÿ0FÿP= state_list; while tstate<>nil do with tstate^ do begin writeln(mfile,' dc.w ',name,'-',m_name); writeln(mfile,' dc.b ',strlen(name):1,',''',name,' ':17-strlen(name),''''); tstate := tstate^.next; 2, 1991.'; copyr;INIT:CONVERT.CODE FULLDUMP = false; (* conditional compilation for tree dump *) allowmodcal = TRUE;  conditional comLIBS:SYSLIB2.CODEAL$ *) MC68020 = FALSE; (* conditional comp end; writeln(mfile,' dc.w 0'); { end of table } end; end; { generate_machine } BEGIN writeln(version); writeln; write('Source file name = ');readln(sname); reset(sfile,sname); write('Machine file name = ');readln(modname); ·Ê· L,COPYRIGHT HEWLETT-PACKARD COMPANY 1982, 1990OPENUNITÿ/Òÿ/ÚENTD®°ÔYRRPGLOBALSRFÌRR®SvP ALIAS ALLOW_PACKED ANSI CALLABS IF  rewrite(mfile,modname); ecode := 0; all_done := eof(sfile); mod_name := ''; state_list := nil; last_state := nil; ref_list := nil; refs_on := true; current_option := none; TRY repeat if not get_sline then escape(1); unt END CODE COPYRIGHT DEBUG DEF FLOAT_HDW HEAP_DISPOSE INCLUDE IOCHECK LINES LIST LINENUM MODCAL OVERLAY OVERLAY_SIZE OVFLCHECK PAGE PAGEWIDTH Pil current_option<>none; if current_option<>machine_name then escape(1); writeln('state machine is ',m_name); current_option := none; repeat if not get_sline then escape(2); until current_option<>none; if current_option<>global ASM_ARCTANASM_ASM ASM_ASSIGN ASM_BCD_REAL ASM_BINARYASM_CLOSEFILESASM_COSASM_DIFFERENCEASM_DIVASM_EQASM_EXP ASM_FLOATASM_GEASM_GTASM_HEX ASM_INTERSECTASM_LEASM_LNASM_LT ASM_MEMAVAILASM_MOD ASM_MOVEL ASM_MOVELEF_recover then escape(2); writeln('global recover state is ',g_recover); if get_sline then begin while not all_done do begin do_state; end; generate_machine; end else error(-1); writeln(mfile,' ENDTASM_MPYASM_NE ASM_NEQUAL ASM_NEWBYTES ASM_NEWWORDS ASM_OCTALASM_RADDASM_RDIVASM_RMULASM_RSUB ASM_SAPPENDASM_SCAN ASM_SCOPYASM_SINASM_SQRTASM_SSUBTOPSUB ASM_UNIONASM_XADELEMENTASM_XINCICI_CI CI_STREAMIN'); RECOVER begin ecode := escapecode; if ecode=1 then writeln('machine_name not found') else if ecode=2 then writeln('global_recover not found'); if ecode>0 then ecode := 0; end; close(sfile); close(mfile,'SAVE'GCONVERT_TEXT_ANY_TO_UCSDCONVERT_TEXT_CONVERT_TEXT FS_FANONFILE FS_FBLOCKIO FS_FCLOSEITFS_FEOF FS_FHPOPEN FS_FHPRESET FS_FINITB FS_FIXNAME FS_FMAKETYPEFS_FPAGEFS_FREAD FS_FREADBYTES FS_FREADCHAR FS_FREADLN FS_FREADSTRFS_$     „ÿ0LÿRMÎDUNUMLÿ0vÿ*ð+â UREQUESTÿ0˜ÿ4Žÿ4t+âÿ UNITENTRYÿ0Äÿ1ÿ0Èÿ/Úÿ0È0ÌDAMÿ0êÿ0îÿ1Üÿˆÿ0îÿ1 TMÿ1ÿ1:ÿÒÿ1FSCÿ16ÿ1†ÿÒÿñ&g8Rmñ 0-ñ HÀå€AíöØÐüú1®0-ÿþ�mûž2-ñ HÁå�AíöØÐüú1€/N¹N^ _TONÐesc <<<<Line NORMALsh-exc, error *MESSAGES=continue, <>=terminate, E=edit Error in interface text: =continueNAÿ® nCîÿ®ÀØSbú/-ÿ¦N¹ ALIAS ALLOW_PACKED ANSI CALLABS IF END CODE COPYRIGHT DEBUG DEF FLOAT_HDW HEAP_DISPOSE INCLUDE IOCHECK LINES LIST LINENUM MOD/-ÿ¦Hnÿ®?<ÿÿN¹Jmøg"N¹„Hmñ./Hnÿ®?<ÿÿN¹N¹?. NºùîN^ _\ONÐNAÿ® nCîÿ®ÀØSbúR­øJ-û#g¶/-ÿ¦N¹/-ÿ¦/Hz®?<?<ÿÿN¹//. ?<N¹/Hz†?<?<ÿÿN¹Hnÿ®?<ÿÿN¹JmøgZN¹„Hmñ./Hzf?<?<ÿÿN¹//. ?<N¹/Hz.?<CAL OVERLAY OVERLAY_SIZE OVFLCHECK PAGE PAGEWIDTH PARTIAL_EVAL CODE_OFFSETS RANGE REF SAVE_CONST SEARCH_SIZE SEARCH STACKCHECK SWITCH_STRPOSSYSPROG TABLES UCSD WARN ?<ÿÿN¹/Hnÿ®?<ÿÿN¹N¹N^ _PONÐ): ***WARNING (line***WARNING: (lineNAþ~ n Cîÿ†ÀØSbúAîÿ†$mû–2. ÃüŒCò„ÀØSbú|ÿ…J.ÿ…f¢U�N¹Jg?<‘Nºø†;|ÿÿÿþNJ`€/-ÿ¦N¹/-ÿ¦/Hzþ?<?<ÿÿN¹/Hnÿ†?<ÿÿN¹/Hzð?<?<ÿÿN¹< ·ÊNuNARmöè=möèN^NuNAøtHnùäHnüz/<ÿÿÿþN¹Aîùä!mÿú+HÿúHnü|Hnÿ/<N¹Aîü|!mÿú+HÿúR­ø|øû"/-ÿ¦N¹p°mûžo0-ûžHÀ-@ÿö`:Bg0-ûžU@AíÐüû¨Hp< 0-ûžS@D@HÀ/N¹0-ûžHÀПS€-@ÿö0-ÿþHÀ�®ÿö €Üo0-ÿþ�|ÜHÀ-@ÿö .ÿö?<ÿÿN¹/-ÿªHnÿƒN¹/-ÿ¦N¹p°.ÿƒf ;|ÿþNJHmóÆHz’N¹HmóÆ?<Hnÿ†Hz„N¹p °­ÿêfšp.ÿ†Z@rx²@mŠHmóÆ?<Aîþ‚Cîÿ†EÐÀÙSbú<ÿÿHPHz*-Hþ~N¹ nþ~HPHz*N¹Aîþ‚Cîÿ†EÐÀÙSbú<ÿÿHPHzò-Hþ~N¹ nþ~CÐ$mû–2. ÃüŒAò„ÀÙSbúJ­ÿêWÀAíÐüû¨HpHnÿ0-ÿþHÀ�®ÿö/N¹p°.ÿf| ÿ| ÿ0-ûžHÀ�®ÿö-@ÿú .ÿúAîÿr²0f .ÿúAîÿ¼ÿ  .ÿúR€Aîÿ¼ÿ p2-ÿþHÁ’®ÿöS�-Aùx°®ùxnH-@ÿò .ÿòAîÿr ²0f/-ÿ¦N¹`/-ÿ¦ .ÿòAîÿ0?<ÿÿN¹ .ÿòR€h²/-ÿ¦/Hz„?<?<ÿÿN¹N¹/-ÿ¦/Hzl?<ÿ@ÿ„J.ÿ„g |ÿ…`2J.g B.ÿ…`"/-ÿêHzŒN¹@@ÿ…J.ÿ…gþ<nÿ„J.ÿ„gVHmóÆ-_ÿ~ nÿ~(舀r²€WÀ(è‰�t´�WÁ‚g "mÿžL‘H¨" (D€€ÿѨN^ _PONÐ$@.TEXTMount NORMALSHARED and press NA;mûžñ0-ÿþ?<ÿÿN¹/ -÷üR€/?<N¹/HzZ?<?<ÿÿN¹/?.?<N¹N¹Hnü|?<Hz2HzN¹J­ÿêfÒHnü|?<N¹Hnü|0.HÀ/N¹Hnü|HnùâN¹Hnü|HzÒN¹JnùâgŽHnùä?<HzÐHz¢N¹Hnùä0.ùâHÀ/N¹HnùäHnÿÿN¹nÿÿù|pr.ÿÿ-Aùx°®ùxn$-@ÿòAíÐüû¨r²0f,0-ÿþR@AíÐüû¨r0p ’@0-ñT@�A;@ñTmÿþ`À0-ñÐmñ(;@ñ mÿño;|ÿñ0-ñAíÐüû¨pñ0-ñAíÐüû¨¼û ?<0-ÿþAíÐüû¨Hp< /<PN¹0-ÿþHÀП;@ÿþN^NuNA0-ñAíÐüû¨­ñ0-ÿþAíÐüû¨r ²0gRmÿþ`äN^NuNAÿø;mÿþñ"BmÿþBmûžHmóÆHnùä .ÿòAîù|HpN¹ .ÿòR€hÖ/-ÿ¦/Hnù|?<ÿÿN¹N¹Jmøf¸U�N¹Jg ;|ÿÿÿþNJJmûœfJp°mÿ~fAúôCíðÚÀØSbú`AúöCíðÚÀØSbú/-ÿ¦/Aîø|CúôEÐÀÙSbú<ÿHPHmðÚ-HøxN¹ nøx<øÿHPHzØ-HøtN¹ nøtHP?<ÿÿN¹<?<ÿÿN¹/-ÿªHnÿÿN¹-_ÿü nÿü+hû (舀/Hz`N¹JgT nÿü (°¨l@HmóÆHmû¨Y�/< (�¨/N¹Ï*N¹J­ÿêf `` ;|ÿöÿþNJ`:U�HmóÆN¹Jf(HmóÆHmû¨N¹J­ÿêf `Ä` ;|ÿöÿþNJp°mûšm.| û¨J-ñ%f|ñ'?<cNºôT`B-ñ';|ÿþNJSmûš mû–0-ûšÁüŒAèÿt/-ÿ¦N¹pE°.ÿÿWÀre².ÿÿWÁ‚gb-müœùx nùx0.HÀ!@!mû¤pc°nf0-ñ"S@HÀ €` nùx0-ÿþHÀ € mû–0-ûšÁüŒCð„$nùxAê|ÀÙSbúp.ÿÿ/HzÀN¹Jg ;|ÿþNJ`R/-ÿ¦/Hz ?<&?<ÿÿN¹<?<ÿÿN¹/-ÿªHnÿÿN¹/-ÿ¦N¹p°.ÿÿf ;|ÿþNJp °mñ ^ÀÀ-Að-HÿüU� nÿüHh?-ûš<ûNºû6Jf ;|ÿþNJ nÿü+hû HmóÆ-_ÿø"nÿø#mû  U€+@û¤+hø;h ÿþ;hûž;hŠûœ`þ’Nºý„T­û¤;mÿþ÷ÀN^Nu0NAR­ñ -ñ°­ñ^À ­ÿÿÿñWÁ‚gŽJmño Hmñ.N¹RmñHmñ./Hzz?<?<ÿÿN¹/Hzl?<?<ÿÿN¹/HzL?<?<ÿÿN¹/<$     ÿÿN¹ .ÿòå€AíöØÐüú?0?<N¹ .ÿòR€h¸J­ø g8Hmñ./Hzˆ?< ?<ÿÿN¹//-ø ?<N¹<)?<ÿÿN¹Hmñ.N¹p°møfNºùHmñ.N¹Bmñ +m÷üø J­ÿêg|û$BmøB-ñ&/-÷üHz Nºò–N^Nu, : (see also Listing aborted>>>>>> Error at NAÿ– n Cî "n Hi0( HÀ/N¹N¹3”N^ _Þü NÐNAÿümñ ÿüB-ñ N¹3”p°mÿüfBmÿüAúôCíÿ¨ÀØSbú`"p °mÿüfBmÿüAúÔCíÿ¨ÀØSbúJmÿüg4Bnÿþ0-ÿüHÀ/HzœN¹Jf?<Nºä‚HzˆN¹8¢`d=|ÿþB.ÿýp%°nÿþ^À.ÿýAÂg>Aíÿ¨0.ÿþÁüCùCñpR@± fS@ÿ®ÀØSbúB.ÿ™Bnÿ¬BnÿžB.ÿ˜=|ÿ =|ÿœBnÿšRnÿš0.ÿšHÀå€Ð¼ "è�㉀tDÐ<áªF‚Ŷ¢t᪅¶¢ nÿšmÂpr.ÿ®=Aÿ–°nÿ–n„=@ÿš0.ÿšr0²6®SÀ2.ÿšt9´6®TÁÂg¾J.ÿ˜g$0.ÿšr6®p0’@0.ÿ¬Áü HÁÐ�=@ÿ¬`�J.ÿ™g p°nÿœWÀ2.ÿšt0´6®WÁÂgSnÿžp°nÿœ]À2.ÿšt0´6®fö|ÿý` 0.ÿþR@=@ÿþ`®N¹3”nÿüñ n1nÿþÿþN^.ŸNuPPIFENDNAÿøHmóÆ _-hÿü n<xHhÿ„/Nºþ$p4°mÿüg?<Nºã°HzHN¹8¢p °mûšn ?<`Nºã” n<xHhÿ„?<N¹U� nHhÿ„0-ûšR@?B'NºêŠJg² mû–0-ûšÁüŒAèÿtAð-Hÿø nÿø1mÿþ 1mûž!mû  ­ ?<ÿÿN¹/9€/?<N¹/</?<ÿÿN¹/09舀/?<N¹/</?<ÿÿN¹/9∀/?<N¹/Hz´?<?<ÿÿN¹/HmóÆ _HhR?<ÿÿN¹/< HmóÆ _p(Rr’@?N¹/Hm÷î?<ÿÿN¹/< ?<ÿÿN¹/Hmú®?<ÿÿN¹/HzP?<VÁ‚gPp°nÿœmB0.ÿšr6®p0’@0.ÿœHÀå€Ð¼ $è‚㊀vDÐ<á«FƒÇ¶(¢HÁᩃ¶(¢Rnÿœ`œ0.ÿšr+²6®fJ.ÿ˜g =|ÿ `Bnÿ¢`t0.ÿšr-²6®fJ.ÿ˜g =|ÿÿÿ `=|ÿ¢`J0.ÿšr.²6®f0.ÿœS@=@ÿž|ÿÿ™`(0.ÿšrE²6®fJ.ÿ™f 0.ÿœS@=@ÿž|ÿÿ˜0.ÿšR@hþx0.?<ÿÿN¹/?-ñ?<N¹N¹Hmñ.N¹+|ñN^Nu] 3.25MPascal [Rev Page NA npШÿî!@ÿö0-ñ,HÀ°¨ÿöl$/-ÿ¦N¹?<YNºñ¬Nºýþ n!|ÿö n (ÿöШÿêS€2-ñ,HÁ²€lh0-ñ,HÀ�¨ÿöR€!@ÿúHmñ./Hhÿz?<o?(ÿüN¹N¹ n (ÿú‘¨ÿê (ÿúCèÿzHqHhÿz/(ÿêN¹ÿ¬Áîÿ 2.ÿžHÁÐ�=@ÿ¬/-ÿö/Hz"+OÿöHnÿ¢/.N¹+oÿöÞü Nú ,_+_ÿöpí°mÿþf?<2NºéÜ`NJN^ _PONÐNAÿ® nCîÿ®ÀØSbú/. p.ÿ®T@lR@â@HÀ/N¹Aîÿ®$n $RCÒÀØSbúN^ _PONÐNAÿüp nr=Aÿü°nÿünR=@ÿþ n0.ÿþra²0SÀ n2.ÿþtz´0TÁÂg n0. n!|ÿöNºýt`€N^.ŸNuNAÿþ0-ÿþ�mûžS@=@ÿþ0-ûžAíÐüû¨r²0fUnÿþJnÿþWÀÿ@ N^.ŸNuNAÿrJ-ûg |*ÿÿ`|:ÿÿNºýHmñ.//-÷ü?<N¹.ÿÿ?<ÿÿN¹U�/Nºÿv-ñ €g,Hmñ./<úS?<ÿÿN¹Hzô?<?< N¹`úJ-û!g¦J­û.gNHmñ./<úD?<ÿÿN¹ÿþr0p ’@ n0.ÿþ�0.ÿþR@h¨N^ _\ONÐNAÿôNºó‚/-ÿö/Hz+OÿöR­øNv+oÿöÞü Nú ,_+_ÿöpü°mÿþf+|ø`NJR­÷ü ­ÿþ÷üoB­÷üR­øRmÿþ -ø�­ø//<N¹JŸWÀ-û&AÂg/-ÿ¦<ÿ.?<ÿÿN¹Jmñ ^ÀÀ-ñ&r²møWÁ€gNº÷|B-û;mú(ú*;m÷ê÷ì mÿÿþ^À2-ÿþ//-û.?<N¹/0-ú*Ðm÷ì??<N¹< ?<ÿÿN¹`NHmñ./<úD?<ÿÿN¹/Hzl?<?<N¹/0-ú*Ðm÷ì??<N¹< ?<ÿÿN¹`NHmñ./<úC?<ÿÿN¹/Hz?<?<N¹/0-ú*Ðm÷ì??<N¹< ?<ÿÿN¹0-ÿþ�mûžHÀ-@ÿêpn°®ÿêl -|nÿê0-ûžAíÐüû¨AíÐüû¨J0WÁ‚g NºòÔ`n0-ÿþAíÐüû¨r²0WÀr²mûœWÁÂgBSmûš mû–0-ûšÁüŒAèÿtAð-HÿøU� nÿøHh?-ûš<ûNºîäJf ;|ÿþNJ nÿø+hû +Pû¤+hø;hŠûœHmóÆ-_ÿô"nÿô#mû )舀/HzÚN¹Jg6 nÿô (°¨lHmóÆHmû¨/<N¹` ;|ÿøÿþNJ`.U�HmHpHnÿz/.ÿêN¹p°.ÿzfFp.ÿ{r �AHÀ-@ÿîJ®ÿîoHmñ.<ú ?.ÿðN¹U®ÿêHnÿ|Hnÿz/.ÿêN¹` -|ÿî/NºüæHmñ./Hnÿz?<o .ÿêS€?N¹N¹Jmñ oAîÿzp rooÀS�núB®ÿêp2-ñ HÁ-Aÿv°®ÿvnP-@ÿò .ÿòå€AíöØÐüúAð-Hÿr nÿr0(Cîÿz¼ÿ^0(HÀ°®ÿêm0(R@óÆN¹Jg;|ÿøÿþNJ`HmóÆHmû¨N¹J­ÿêg ;|ÿöÿþNJ nÿø;h ÿþ;mÿþ÷À;hûžJmûœf";møø+m÷ø÷ü;mñ*ñ(J-ûfmû ûNºðz` ;mÿþûžNºðlmû û!N^.ŸNu0NA0-ÿþAíÐüû¨r ²0fRmÿþ`äN^.ŸNuNA|ÿ JmÿüfX<PHmÿ¨NºüØAíÿ¨CúNpR@± fS@föB. `&HÀ-@ÿê .ÿòR€hªW®ÿêHnÿ}Hnÿz/.ÿêN¹Nºú^Hmñ.<ú pЮÿîS€?N¹/NºüHmñ./Hnÿz?<o?.ÿìN¹N¹NºúHmñ./Hzr?<?<ÿÿN¹/HmóÆ _HhR?<ÿÿN¹/</?<ÿÿN¹//-ø?<N¹/Hz?<?<ÿÿN¹?-ðâ?<N¹p2-ñ HÁ-Aÿv°®ÿvnB-@ÿòHmñ./HzÆ?<?<Aíÿ¨Cú*pR@± f S@fö` ?<Nºæ N¹3”N^.ŸNuONOFFNAÿò-mú,ÿòHz>HnÿüHnÿöN¹@|+nÿòú, .ÿü°­úDg?<2NºåÀB® `-nÿø N^.ŸNuPNAÿü n Bp$°mÿüg?<ˆNºå„`jJ-û�g n ¼ n mû•`L-mû’ÿü nÿüp.°h l?<ˆNºåB`( nÿü"n ¨ Hh%     û¤!mø1mûœŠHmóÆ-_ÿø nÿø(舀r²€f+|û !mû `B­û B­û¤Jmñ ^ÀÀ-ñ&r²møWÁ€gNºíPRmÿþNºñôRmûšB­øBmûœNºíp`F?<aNºâ¨U� mû–0-ûšÁüŒHp„?-ûš<ûNºé®Jf;|ÿþNJ`HmóÆ _!nÿüN^.ŸNuNAÿðJ-ñ!g ?<]NºâF|âñ!-mú,ÿòmúlÿñ|úNºÛ*Hz2N¹8¢J.ÿ1gÿ4`ÊJ-û&f ?<XNºÛY�/Nºõ-_þ˜J®þ˜]À ®ÿþ˜^Á‚g?<ˆNºÚÚ`Jm÷âf ;nþš÷â` ?<‰NºÚ¼Jm÷âgHm÷Þ0-÷âHÀé€/N¹`RU�/Nºô(_û`Bp°møf+mññNºæÎS­ñ`&Y�/Nºôt-_þ˜pP°®þ˜o;|Pñ,?<ˆNºÚL`& ®„þ˜o;|„ñ,?<ˆNºúlHzRHnÿüHnÿöN¹@|nÿñúl+nÿòú, .ÿü°­úTg?<‡Nºáü` .ÿøÀ<ÿÿ@@ñ N^.ŸNuPNAýüJ-û&f ?<XNºáºp"°mÿüf@Y�/.Nºû² n Ÿ nJ�]À n �ÿ^Á‚g?<ˆNºá~ n ®`Ž<ÿHnÿ/.NºûÄp.ÿAîÿr:²0g>AîþCîÿEÐÀÙSbú<ÿÿHPHzVÚ.`;nþšñ,`ÖU�/Nºó¬_û`ÆJ-úlg ?<ZNºÚU�/NºóŒ_û'`¦U�/Nºó|_û`–Hmúœ/<<Hmúx/Nº÷ü`zU�/NºóP_û`jJ-û&f ?<XNºÙ¤Y�/Nºó¨-_þ˜J®þ˜]À ®þþ˜^Á‚g?<ˆNºÙz` Jm÷äf .þ˜R€;@÷ä` ?<‰NºÙXJm÷ägHm÷ÚpzÁí÷ä/N¹;|÷æAíþô$m-HýüN¹ nýüCÐAîÿÀÙSbú.ÿ°.c?<ˆNºàþ`Aîÿ$n CÒÀØSbúN^ _ÞüNÐ:NAý‚J-ûg ?<^NºàÄ|àñ/Nºû´J-ñ ghp°nÿþfB-ñ B-ñ!`Np°nÿþf ?<]NºàˆB-ñ 0.ÿþHÀ/Hz jN¹JgHz `N¹8¢` Hz \N¹8¢|ñ ` 0.ÿþmð°|$nèã@2;Nû÷Ú2-÷æÃüzCò†ÀØSbú`ÌJm÷äf;| ÷äHm÷ÚpzÁí÷ä/N¹Bm÷æB.ÿ1p$°mÿüfb<xHnÿ„/Nºó8<óxHnÿ„?<N¹0-÷äS@°m÷æn?<\NºØ®`$Rm÷æAîÿ„$m÷Ú2-÷æÃüzCò†ÀØSbú` ?<‡NºØ|p°mÿüWÀr²mÿüWÁ‚g N¹3”`(p4°mÿüf |ÿ1`?<NºØ@HzRN¹8¢J.ÿ1gJNœ¬Ììö2Dd€:DT~êÊ ”¤À @Pl|(HlŒ¬Ì`˜J-ûf ?<mNºßÒJ-úmg ?<†NºßÂB-û<ûPHnÿ2/Nºú<úPHnÿ2Nºö,HmúrHnÿ2NºõÎ`JU�/Nºù _û`:J-û&f ?<XNºßtU�/Nºù_û`U�/NºøðJg Bmúv`;|úv`ú/Nºüæ`ðJ-ñ!g B-ÿBRm÷æAíþô$m÷Ú2-÷æÃüzCò†ÀØSbú`¾J-úlg ?<ZNº×øU�/Nºñ„_û`žU�/Nºñt_ûJ-û&f ?<XNº×ÌB-û+`zU�/NºñP_ûJ-û&f ?<XNº×¨`ZJ-úlg ?<ZNº×”U�/Nºñ _û`:U�/Nºñ_ûJ-û&f ?<XNº×h`U�/Nºðð_û#` ?<‰Nº×Lp°mÿüVÀr²mÿüVÁÂgözp4°mÿüñ!` ?<]Nºß"`ÔJ-úlg ?<ZNºßU�/Nºøš_û`´<PHmú¸/NºùR`¢J-úlg ?<ZNºÞÜU�/Nºøh_û`‚Hmú /< <HmúŠ/Nºüè`fJ-úlg ?<ZNºÞ Bmû Jmÿüf|<PHmÿ¨NºõAíÿ¨Cú²pR@± fS@fö;|û `HAíÿ¨Cú”pR@± fS@fö;|û `&Aíÿ¨CújpR@± f g?<Nº×$Hz@N¹8¢B-ñN^.ŸNuP)ONOFFTESTlock%Error closing listing file, ioresult(NAÿþRmÿþmñ ÿþ|úñ SmÿþB.ÿÿRmÿþ0-ÿþAíÐüû¨r ²0f(J-÷Âg;mÿþ÷ÀRmÿþN¹™úSmÿþ/.Nºí:`Ä0-ÿþAíÐüû¨S@fö` ?<NºÞ N¹3”`ÌJ-û&f ?<XNºÞU�/Nº÷’_û(`¬/Nºú`¢U�/Nº÷x_û`’Y�/Nº÷à+_ñp°­ño?<ˆNºÝ¾+|ñ`hp$°mÿüf<xHnÿ„/Nº÷üJmøVÀ-û%AÂgî<xHnÿ„?<N¹Hmñ.Hz¨N¹J­ÿêg~|þŠ-mÿêþ <ÿ HnþŠAîþ˜ ¼HP/.þ ?<N¹r}²0f|ÿÿRmÿþ`:0-ÿþAíÐüû¨r*²0f$0-ÿþR@AíÐüû¨r)²0f |ÿÿTmÿþJ.ÿÿgÿ^nÿþñ N^.ŸNuNAÿ~B®ÿø0-ÿþAíÐüû¨r#²0WÀ2-ÿþAíÐüû¨t'´0WÁ‚g40-ÿþAíÐüû¨r#²0fªRmÿþJ-ûg ?<^NºÕj0-ÿþrAíÐüû¨0/Hz|N¹Jgò0-ÿþAíÐüû¨r0p0’@/-÷üAîýŠCúfEÐÀÙSbú<ÿHPHnþŠ-Hý†N¹ ný†<ýÿHPHz"-Hý‚N¹ ný‚HPNºãHmñ.?<Hnÿ„HzüN¹J­ÿêWÀÿ@ñ&J-ñ&gp°møf;|ø` ?<�NºÜš`.U�/Nºö"_ÿ0p°møfJ.ÿ0g ;|ø`Bmø`U�/Nºõò_ûJ-û&f ?<XNºÜJ`üY�/NºöJS—+_÷üpÿ°­÷ü^ÀHÁ-AÿüRmÿþ0-ÿþrAíÐüû¨0/HzBN¹Jg€/-ÿö/HzP+Oÿö0-ÿþAíÐüû¨/< /.ÿüHîÿ~N¹Lîÿ~r0ÒŸNvp0’€Nv-Aÿü+oÿöÞü Nú ,_+_ÿöpü°mÿþf-|ÿü`NJRmÿþ`ÿ`R®ÿø ®ÿÿüo ?<ÄNºÔl .ÿü€ÿ".ÿø€…`n0-ÿþrAíÐüû¨0/Hz|N¹0-ÿþAí ­ÿþ÷ü^Á‚g?<fNºÜB­÷ü`ÆJm÷âf;| ÷âHm÷Þ0-÷âHÀé€/N¹Bm÷èB.ÿ1p$°mÿüfp<xHnÿ„/Nºö0p°.ÿ„d?<ˆNºÛ¼`H0-÷è°m÷âm?<\NºÛ¤`0<xHnÿ„NºòRm÷èAîÿ„$m÷Þ2-÷èHÁé�CòðÀØSbú` ?<ˆNºÛfp°mÿüWÀr²mÿüWÁ‚g N¹3”`(p4°mÿüf |ÿ1`?<Ðüû¨r`²0VÀÀg*R®ÿø0-ÿþAíÐüû¨0".ÿø€…Rmÿþ`Rmÿþ?<ÅNºÓêJ-ñg ?<NºÓÚ`rRmÿþR®ÿø0-ÿþ".ÿøAíÐüû¨°…0-ÿþAíÐüû¨r ²0f?<”NºÓš`.0-ÿþAíÐüû¨r'²0f¬Rmÿþ0-ÿþAíÐüû¨r'²0g”S®ÿø`ý¢Smÿþ;|$ÿü+nÿøûŒp°®ÿøf|û�p.ÿ†+@û’`XHnÿô%      $>`‚BmÿüAútCíÿ¨ÀØSbú`~BmÿüAújCíÿ¨ÀØSbú`dJ-ûfBmÿüAú,Cíÿ¨ÀØSbú`BJ-ûfBmÿüAúCíÿ¨ÀØSbú` J-ûfBmÿüAúìCíÿ¨ÀØSbú`¬;|4ÿüJ-ñf Rmÿþm÷ÂÿÿB-÷Â/Nºë’nÿÿ÷Â`ýÈ`|/Nºõ¾`ýº`n0-ÿþR@AíÐüû¨r*²0fRmÿþ?<ÿÿN¹N¹` /-ÿ¦/Hz´?< ?<ÿÿN¹N¹-û€-û€-ûg /-ÿ¦/HzÀ?<1?<ÿÿN¹N¹J-û$g /-ÿ¦/Hzv?<?<ÿÿN¹N¹N^ _TONÐ. Noin normal error. errors. See line warning. lines, warnings. at offset Listing abortedCOMPILATIO/Nºõ”`ý�`.0-ÿþR@AíÐüû¨r.²0fRmÿþ;|ÿü`;|ÿü`;|ÿü` ;|ÿü`RmÿþJ-÷ÂgN¹™ú`ý2`æ0-ÿþR@AíÐüû¨r.²0fRmÿþ;|3ÿü`.0-ÿþR@AíÐüû¨r)²0fRmÿþ;|ÿü`;|ÿü`�0-ÿþR@AíÐüû¨r=²0fRmÿþ;|ÿü`;|ÿü``;|ÿü`V;|N ABORTED***** Nonstandard language features enabled *****NAþþU�<x/.N¹p°_g^p n=@ÿþ n0.ÿþr.²0gSnÿþ`èHnþþ//./<0.ÿþS@HÀ/N¹ _CÐ$n AÒÀÙSbú` nCÐ$n AÒÀÙSbúN^ _PONÐNAþHmû–/<xN¹ müœJ( g müœCèˆ <ÿ�­ûŒ"< ’€R�lR�â�/N¹-nÿôÿ‚ nÿ‚0¼1nÿú Hnÿ†Hh /.ÿøN¹B-û�+nÿôû’N^.ŸNuÿÀÿÀÿÿÿÿÿÿÿàNAÿŽBnÿî0-ÿþHÀ-@ÿðB®ÿôRmÿþ0-ÿþAíÐüû¨r0²0RÀ2-ÿþAíÐüû¨t9´0UÁ‚gÐ0-ÿþAíÐüû¨r.²0fr0-ÿþR@AíÐüû¨r.²0VÀ2-ÿþRAAíÐüû¨ÿü`L;|ÿü`B;|ÿü`8;|&ÿüBmÿú`*;|'ÿü;|ÿú`;|'ÿü;|ÿú` ;|&ÿü;|ÿú`ú;|(ÿü0-ÿþR@AíÐüû¨r0’|=m4²|n,ãA0;Nû;| ÿúRmÿþ`;| ÿúRmÿþ`;|ÿú`œ;|(ÿü;| ÿú`Œ;|(ÿü0-ÿþR@AíÐüû¨r=²0f;| ÿúRmÿþ`;| ÿú`V0-ÿþt)´0VÁÂg@=|ÿîRmÿþ0-ÿþAíÐüû¨r0²0SÀ2-ÿþAíÐüû¨t9´0TÁÂgRmÿþ`Ì0-ÿþrAíÐüû¨0/HzÀN¹Jgä=|ÿî0-ÿþHÀ�®ÿðR€-@ÿôRmÿþ0-ÿþS@rAíÐüû¨0/Hz�N¹-ûÀg ?<^NºÑt0-ÿþrAíÐüû¨0/HzHN¹JgRmÿþ0-ÿþAíÐüû¨r0²0RÀ2-ÿþAíAíÐüû¨r ²0f(J-÷ÂgRmÿþN¹™úSmÿþ/Nºàþ;mÿþ÷À`RmÿþJ-ñ f ?<bNºÉä`ûJRmÿþJ-ñ g`û:p1°mÿüVÀÀ-÷ÂgN¹™úN^NuTRYANYVARFORWARDRECOVEREXTERNALNAÿö n0Cîÿö2À2ØU@bÿú0-ÿüHÀ/HnÿöN¹JfNºúÀ`âN^.ŸNuNAHmóÆHz®N¹/-ÿö/Hz+OÿöÐüû¨t9´0UÁ‚g/-÷üHz*Nº×00-ÿþAíÐüû¨r0²0SÀ2-ÿþAíÐüû¨t9´0TÁÂgRmÿþ`ÌJnÿîfè;|"ÿüB®ÿø/-ÿö/Hzt+Oÿö .ÿð2-ÿþSANvHÁ-Aÿ’°®ÿ’nH-@ÿü .ÿüAíÐüû¨r0p0’@Nv/< /.ÿø-AÿŽN¹".ÿŽHÁ“—Nv-_ÿø .ÿüR€h²+oÿöÞü Nú ,_+_ÿöpü°mÿþf?<•NºÐ8`NJ|R­øNv+oÿöÞü Nú ,_+_ÿöpü°mÿþf+|ø`NJR­÷ü ­ÿþ÷üoB­÷üR­øJmñ ^ÀÀ-ñ&r²møWÁ€gNºÓNRmÿþJ-ñ'gNº×êJ-ñ&gJ­ø^ÀJmñ^Á‚J­ø^À€gêp°nf2NºÔàHmñ.N¹NºÔÒHmñ./Hz:?<?<ÿÿN¹N¹NºÔ°Hmñ.N¹NºÔ¢J­øo”Hmñ./-ø?<N¹pû�J-û‹g +nÿøû’`( ®€ÿøo .ÿøD€+@û’`B­û’?<•NºÏô`Ò;|#ÿüHnÿè/<N¹-nÿèÿ’ nÿ’BP0-ÿþHÀ�®ÿð-@ÿüpP°®ÿül?<¨NºÏ®-|Pÿü .ÿüR€@ÿ–J-û‹g |-ÿ—`|+ÿ— .ÿðAíÐüû¨HpHnÿ˜/.ÿüN¹J®ÿôo .ÿôR€¼ÿE–p.ÿ–r.²6–f ?<NºÏ:Hnÿ– nÿ’Hh°­øfHmñ.Hz’?<?<ÿÿN¹`Hmñ.Hz€?< ?<ÿÿN¹J­ø g?<?<ÿÿN¹`/-ÿ¦/-ø?<N¹p°­øf/-ÿ¦Hz?<?<ÿÿN¹`/-ÿ¦Hz?< ?<ÿÿN¹J­øf/-ÿ¦HzÐ?<?<ÿÿN¹`/-ÿ¦/-ø?<N¹p°­øf$/-ÿ¦/HzÂ?< &     Aíö^ÀÙSbú`~/-ÿ¦Hzn?<?<ÿÿN¹/-ÿ¢/<ÿxHmö^N¹N¹<xHmö^?<N¹Aíö^CúöpR@± f(S@föU�N¹Jg;|ÿÿÿþNJ` ;|ÿþNJU�Hmö^?<B'NºÉ¸_ñ J-ñ f´U�N¹Jg?<‘NºÂr;|ÿÿÿþNJ`’ müœJ( g$/-ÿ¦/Hmö^?<ÿÿN¹< ?<ÿÿN¹/-ÿ¦Hzbf$Hmñ./HzŒ?<?<ÿÿN¹N¹`0 nÿà"Pp °if Hmñ./Hz`?<?<ÿÿN¹N¹ nÿà-hÿôJ®ÿôg(N¹„ nÿôHhNºü¬Hmñ.N¹ nÿô-Pÿô`ÒN^.ŸNuset:arrayrecordstring:paofchar:value not savedstructured constant: NAHmñ./<ú ?.N¹/ nHP?<?<ÿÿN¹/-ÿ¢/<ÿxHmö^N¹N¹<xHmö^?<N¹Aíö^CúpR@± fS@fö;|ÿÿÿþNJJ-ñ gÿ,/-ÿ¦N¹;|ûšBmûœB-ñ B-ñ!B-ñB-ñ%;|nñ(HmóÆ-_ÿ‚ nÿ‚(舀r²€f+|û !mû `B­û B­û¤NºÌ"B-û'/-ÿ¦HzØ?<?<ÿÿN¹/-ÿªHmñ N¹p-ñ /Hz.N¹?<ÿÿN¹< npr’@?N¹N^ _PONÐNAÿüN¹„Hmñ.<ú ?.N¹J® f$Hmñ./Hzª?<?<ÿÿN¹N¹`(-n ÿü . °­úDfHmñ.Hz@?<?<ÿÿN¹`È . °­úLfHmñ.Hzò?<?<ÿÿN¹`¢ . °­úTfHmñ.Hzü?<?<ÿÿN¹`| . °­úPfHmñ.Hzª?<@U�-@ÿ‚N¹ .ÿ‚Àg ;|ÿÿÿþNJp-ñ /HzN¹Jg¢/-ÿ¦/-ñ ?<ÿÿN¹N¹pa°-ñ bp-ñ r �A@ñ B-û%pN°-ñ fBmøB-ñ&`npL°-ñ fÊ|û%;|øB-ñ&/-ÿ¦N¹/-ÿ¦Hzà?<?<ÿÿN¹/-ÿ¢/<ÿxHnÿ†N¹N¹<xHnÿ†?<N¹Hmñ.?<Hnÿ†?<ÿÿN¹`V nÿü0(m °| nã@2;Nû2 ꎼ t òZHmñ.Hzl?<?<ÿÿN¹`Hmñ.HzÜ?< ?<ÿÿN¹Hmñ. nÿü/(?<N¹Hmñ.Hz ?<?<ÿÿN¹Hmñ. nÿü/(?<N¹`ªHmñ./HzZ?< ?<ÿÿN¹ nÿü/(?<N¹`|Hmñ./Hz8?< ?<ÿÿN¹HzLN¹J­ÿêf |ñ&`:U�N¹Jg;|ÿöÿþNJ` /-ÿ¦/Hz4?<?<ÿÿN¹N¹J-ñ&gÿX`œpY°-ñ f ;|ø`;|øHmñ.?<Aîþ†CúÎEÐÀÙSbúHnþ HmóÆ"_HiR-HþNºû” nþ<þÿHPHnþ -HþN¹ nþ<þÿHPHz€-HþN¹ nþHPHzjN¹J­ÿêWÀÿ@ñ&+|< nÿü/(?<N¹`NHmñ.Hz¼?<?<ÿÿN¹`4Hmñ./Hzp?<?<ÿÿN¹/ nÿü/(?<N¹/Hz>?<?<ÿÿN¹ nÿü/(?<N¹`ÞHmñ.Hz ?<?<ÿÿN¹`ÄHmñ.Hz?<?<ÿÿN¹ nÿüJ(g0Hmñ./HzH?< ?<ÿÿN¹ nÿü?( ?<N¹`,Hmñ./Hzè?<ñ+|ÿÿþñ;møø;|xñ,BmñBmñ B­øB­ø N^Nu @ @ @ @.ASCPRINTER:not found. file ? Error opening fileCompile what text? What listing file? Printer listing (l/y/n/e)? J­ñ2f"Hmñ.HmóÄ/<ÿÿÿýN¹Aíñ.!mÿú+HÿúJ­óÊf"HmóÆHmö\/<?<ÿÿN¹ nÿü/( ?<N¹`FHmñ.Hzž?<?<ÿÿN¹`,Hmñ./Hz?<?<ÿÿN¹ nÿü?(?<ÿÿN¹Hmñ./HzÊ?< ?<ÿÿN¹ nÿü/?<N¹ nÿüJ(gHmñ.HzL?<?<ÿÿN¹Hmñ./Hz-nÿüÿä nÿä0ã@2;Nû &.`’*Hmñ.Hh ?<ÿÿ?<ÿÿN¹`Hmñ.Hz?<?<ÿÿN¹p nÿä"( S�-Aÿà°®ÿànØ-@ÿì .ÿì€J€f(N¹„Hmñ.N¹Hmñ.Hz®?<?<N¹ .ÿìlм?(?<N¹ nÿüJ( gHmñ.HzÚ?<?<ÿÿN¹Hmñ.N¹ nÿü0(Y@mR°|nJã@2;Nû$>>>>>/(0.T@?N¹Mb` nÿü/(0.T@?N¹Mb`N^ _\ONÐ..realcharset file max=scalararray recordintegerbooleanpointerelsize= (OFLO) align= signeÿà€=@ÿè .ÿì€ÿ=@ÿê nÿä-hÿðp=nÿèÿÞ°nÿÞn=@ÿø nÿð-Pÿð0.ÿøR@hä0.ÿêHÀ/ nÿðHhN¹JgHmñ.<ú1?<ÿÿN¹`Hmñ.<ú0?<ÿÿN¹ .ÿìR€hÿ$`úHmñ./Hz?< ?<ÿÿN¹ nÿäHh ?<ÿ?( N¹`ÈHmñ./HzÖ?<?<ÿÿN¹ nÿäHh ?<ÿ?( N¹`–Hmñ.HzdNIL type bitsize=elbitsize=prok parmlc=funk parmlc= unpacksize=subrange min=unexpected form=NAÿüJ® gD-n ÿü nÿü/(?.NºÿàN¹„?. nÿü<ÿP/NºúF nÿü0(mÔ°|nÌã@2;Nû(NÄ((NHmñ.Hzê?<?<ÿÿN¹`šHmñ.Hzô?<?<ÿÿN¹ nÿüHh®?< ?<ÿÿN¹p nÿäHÀ-h ÿà°®ÿànj=@ÿø0.ÿøHÀ�üFH@J@lÐ|FJ@f(N¹„Hmñ.N¹Hmñ.Hz:?<?< N¹Hmñ. nÿä0.ÿø0 ?<N¹0.ÿøHÀR€h�`þN¹„Hmñ.Hz*?<?<ÿÿN¹ nÿäJ¨f$Hmñ./Hzö?<?<ÿÿN¹N¹`´ nÿä-hÿàHmñ.N¹N¹„ nÿà"Pp°iNºö"`tHmñ./Hzì?<?<ÿÿN¹/ nÿü?(?<N¹/Hzª?<?<ÿÿN¹ nÿü/(?<N¹ nÿü0($ã@2;Nû2Lf¼ Öø²8bðHmñ.Hz^?<?<ÿÿN¹`ÞHmñ.Hz ?<?<ÿÿN¹`ÄHmñ.Hzf?< ?<ÿÿN¹`ª nÿüJ¨ fHmñ.Hz ?<?<ÿÿN¹`.Hmñ./Hz&     Hmñ.N¹N¹„Hmñ./HzÆ?<?<ÿÿN¹/ n PHP?<ÿÿN¹N¹0-ú&ÁüAíÐüøBAð-Hÿø nÿøp°hfèN¹„Hmñ./Hzp?< ?<ÿÿN¹N¹ nÿø"h"Q-iÿü"h"Q/)BgNº÷¸J®ÿüg nÿü/(BgNº÷¢ nÿü-hÿü`ÞN¹„Hmñ.N¹N¹„Hmñ./Hz?< ?<ÿÿN¹N¹NºþÌ`® nÿî-PÿøJ®ÿøf ®`†Y�/.ÿøHnÿü n/N¹QÊ-_ÿôJ®ÿôfB?<eAîþî"n"QEÑCÐÀÚSbú<ÿHPHzX-HþêN¹ nþêHPN¹à`$p°®ÿôf nÿü!n` nÿü!n nB¨ nB¨N^.ŸNuNIL already definedNA| mú P"n$i °�g" i Pp°hWÀ nÿø-hÿüJ®ÿüg nÿü/(BgNº÷B nÿü-hÿü`ÞN¹„Hmñ.N¹N¹„Hmñ.N¹ nÿø/BgNº÷ N¹„Hmñ.N¹N¹„Hmñ./ n PHP?<ÿÿN¹/Hzn?<?<ÿÿN¹N¹N¹„Hmñ.N¹J­ÿêg|û$BmøB-ñ&/-÷üHz:N¹LN^ _PONÐDump of Imported:Exported: dump  i PÀ(8gB. N^.ŸNuNAÿð;mú&úB­úJmúm.0-úÁüAíÐüøBAð-Hÿô nÿôp°hf’U�/(/.Hmÿ¨NºøúJgU�/Nºÿ^Jg`ä nÿô-hÿüJ®ÿügR-nÿüÿø-nÿøÿðU� nÿð/( /.Hmÿ¨Nºø®JgU�/NºÿJg`˜ nÿð-hÿø nÿü-hÿü`¨`p nÿôp°hfbU�/(/.Hm¦?<?<ÿÿN¹ nÿü"h HQ?<ÿÿN¹`THmñ.HzÖ?<?<ÿÿN¹`:Hmñ.HzÄ?<?<ÿÿN¹` Hmñ.Hzþ?< ?<ÿÿN¹`Hmñ./HzD?<?<ÿÿN¹ nÿü/(&?<N¹`ØHmñ.Hz„?< ?<ÿÿN¹ nÿü/(&?.Nºød`®Hmñ.Hzd?< ?<ÿÿN¹ nÿü/(&?.Nºø:Hmñ.Hzº?<completeListing abortedNuNAJ® g*Y�/. /.Hmÿ¨N¹QÊJŸf` nB�` nB�N^ _PONÐNAÿü|J®gD-nÿü nÿüJ¨g&Y�/(/. /.N¹QÊJŸf +nú` nÿü-h`¶B.N^ _Þü NÐNAÿü|J®gŠ n-Pÿü nÿüJ¨g&Y�/(/. /.N¹QÊJŸ?<ÿÿN¹ nÿü/( ?.Nºø`^Hmñ./HzN?< ?<ÿÿN¹/Hz˜?<?<ÿÿN¹ nÿü (X€/?<N¹`Hmñ.Hz?< ?<ÿÿN¹`þHmñ./Hz?< ?<ÿÿN¹ nÿü/(?<N¹ nÿüJ(g,Hmñ./HzÐ?< ?<ÿÿN¹ nÿü?( ?<N¹`š nÿüp°hf>J(8gHmñ.Hzöf +nú`  nÿüJ¨gU�/(/. /.Nºÿ6Jg`x nÿüJ¨ gU�/( /. /.NºÿJg`PJ®gD-nÿü nÿüJ¨g&Y�/(/. /.N¹QÊJŸf +nú` nÿü-h`¶B.N^ _Þü NÐNAÿø;mú&úB­úJmúm¶0-úÁüAíÐüøBAð-Hÿø nÿøJhgŠJ�gY�/Hnÿü?<?<ÿÿN¹`Hmñ.Hz²?<?<ÿÿN¹`Hmñ.Hzž?<?<ÿÿN¹ nÿü0(m*°|n"ã@2;NûD‚Hmñ./Hz¦?<?<ÿÿN¹/ nÿü?(?<N¹< ?<ÿÿN¹`ÔHmñ./Hz–?< ?<ÿÿN¹/ nÿü?(?<N¹< ?<ÿÿN¹`–Hmñ./HzÒ?<?<ÿÿN¹ nÿü?(Hmÿ¨N¹QÊJŸf`† nÿøp°hf*J¨gU�/(HnÿüHmÿ¨Nºþ&Jg`T`2 nÿøp°hf$U�/(HnÿüHmÿ¨Nºþ\Jg`&;|úSmú`ÿFB®ÿüJ-ûg ?<hN¹.J®ÿüg4 nÿü0(HÀ/Hn N¹JfB®ÿüJ-ûg ?<gN¹.J®ÿüWÀÀ-ûg¬BmúB­ú/<Hn N¹Jg -m?<N¹ nÿüp°hf,Hmñ./Hzú?<?<ÿÿN¹ nÿü/(8?<N¹ nÿüJ((gHmñ.Hz€?<?<ÿÿN¹ nÿüJ()gHmñ.HzH?<?<ÿÿN¹ nÿüp°hVÀ(8AÂ(,‚gÎN¹„Hmñ.N¹N¹„Hmñ./Hz¦?< ?<ÿÿN¹/ m÷ÌHP?<ÿÿN¹/Hzb?< ?<ÿÿN¹/ nÿüø.ÿü`„B§Hn N¹Jg -mø&ÿü`h/<Hn N¹Jg -mø*ÿü`H/<Hn N¹Jg -mø2ÿü`(/<Hn N¹Jg -mø6ÿü`-mø:ÿü n ®ÿüJ®ÿüg,/< nÿüHhN¹Jg/< nÿüHhN¹JgV-û@-ûAÂg-Hþülev= valparm refparmspecial result= relative procparm funcparmstandard __BASE + exit: boundparm entry: var string anyvarparm bitoffset=field offset= globalbase = result type: copyparm; addr= maxlength offset:NAÿøp°møWÀÀ-ñ&gÞN¹„N¹ nþü"mú"Q"Q"Q<úÿHPHQ-HþøN¹ nþøHPN¹àN^.ŸNu already defined in NAþê n PCú^pR@± fS@föJ-û&f ?<lN¹.0-ú&ÁüAíÐüøBAð-Hÿî nÿîp°hf2J¨g&U�/(Hnÿø"n/Nºú Jg /Nºÿ`ä`4 nÿîp°hf&U�/(Hnÿø"n/NºúÎJg /'     ÿ¨Nºø\JgU�/NºþÀJg`F nÿô-hÿøJ®ÿøgB-nÿøÿðU� nÿð/( /.Hmÿ¨NºøJgU�/NºþzJg` nÿð-hÿø`¸ nÿô"h"Q-iÿøJ®ÿøg\-nÿøÿüJ®ÿügB-nÿüÿðU� nÿð/( /.Hmÿ¨Nº÷°JgU�/NºþJg`š nÿð-hÿü`¸ nÿø-hÿø`ž nÿô"h"Q-i ÿøJ®ÿøg\-nÿøÿü/.NºÿJf NIf` n "n )°¨g NIFN^ _Þü NÐNAB.J®VÀJ® VÁÂg n "n0)$°h$g` np °h$gf n "n ) °¨ gR n h p°hf(U� n/( n /( /Nºþ`Jf`´` np°h$VÀ€.g`˜ np°hf0U� n h&J®ÿügB-nÿüÿðU� nÿð/( /.Hmÿ¨Nº÷>JgU�/Nºý¢Jg`( nÿð-hÿü`¸ nÿø-hÿø`žSmú`ýÎ nB�N^.ŸNuNAþø?<eAîÿ"n$i$RGÒEÐÀÛSbú<ÿHPHz>-HþüN¹ nþü"mú"Q"Q"Q<úÿHPHQ-HþøN¹ nþøHPN¹àN^.ŸNu already defined in NAþêB.ÿûJ®g>U� n/( n h&/(B'.Nºÿ,Jf`\J. g& n P"n "QpR@± f S@fö``0 n-h n -h `þæ .°® WÀ@OîN^ _Þü NÐNA . °®f |`$J® WÀJ®WÁ‚g |` n"n 0)°hf  n 0(ã@2;Nû|Ršfˆ¼^âÚRZ ./(Nºÿä_ÿû np°hVÀ n(8A‚gú0-ú&ÁüAíÐüøBAð-Hÿî nÿî0(S@ã@2;Nû.U�/(Hnÿò"n/NºõòJg/Nºþð|þÿû`,U� nÿî/(Hnÿò"n/Nºö(Jg/NºþÂ|þÿû nÿî-PÿòJ®ÿògfY�/.ÿòHnÿö"n/N¹QÊ-_ÿüJ®ÿüfD?<eAîþî"n"QEÑCÐÀÚSbú< °­úDWÀ". ²­úHWÁ‚ .°­úDWÀ$.´­úHW„ÄúB`8B.`0 . °­ú`WÀ".²­ú`WÁ‚úA`U� n /( n/(Nºÿ_`ð . °­úXWÀ".²­úXWÁ‚úA`ÎU� n /( n/(NºþÔ_`°B.`¨ n "n(À)f B.`^ n "n("À)"g |`ÿHPHz>-HþêN¹ nþêHPN¹à|ÿûU� n/(Nºþ¼�.ÿûnÿû N^.ŸNu already definedNAÿüB. J®g8 np°hf* nJ(g n-hÿü .ÿü°­úPWÀú@ N^.ŸNuNAB. U�/.Nºÿ¢Jg nh" N^.ŸNuNAÿþB. J®gJ nJhf> np°hWÀ".²­úT@U�/. NºøNU�/.NºøDÀg U� n /( n/(Nºût_`B.`,B.`$U� n /( n/(B'B'Nºüà_``V n p°hfU� n /(/.Nºýú_`. np°hfU�/. n/(NºýÒ_`B.N^ _PONÐNAÿü-nÿü nÿüp°hf"n "¨"n"¨`ž .VÁÂúAÿÿnÿÿ -ûÀ.ÿÿg ?<^N¹.N^.ŸNuNAÿôHnÿü/<&N¹-nÿüÿø nÿøB(B(0.HÀ €1|Hh HmúN¹ nÿø1|!múP|ú1| B("Hh/<N¹ nÿø-hÿô"nÿôB)"¼3|Hi HmúN¹ nÿô1|!múD!|0.HÀ!@-nÿü N^ _TONа­úHf n ¼ÿÿ€ n ¼ÿ`z .°­úDWÀ nÿüJhVÁ‚g"n "¼€"n"¼ÿÿÿ`H n B� .°­úPf n ¼ÿ`( nJ¨g n h"n"¨` nB�N^ _Þü NÐNAÿð n CîÿôÀØSbú/./<,N¹ n-Pÿð nÿðHPHnÿôN¹d nÿð!múd B¨1|HhHmúN¹NAÿò ®ÿo?<“N¹.-|ÿY�?. Nºÿ n ŸHnÿü <ÿ�®"< ’€R�lR�â�/N¹-nÿüÿö nÿö0¼"n Jg1| "n i `J n h"nÿö3h p=i ÿô°nÿôn(=@ÿú n h0.ÿú"nÿö2.ÿú°  0.ÿúR@hÒ nÿö0( R@HÀ-nÿò°®ÿòn=@ÿú nÿö0.ÿú¼ÿ 0.ÿúHÀR€ nÿð!mû6 1|0.HÀ!@1|$N^ _Þü NÐNu      NAJmðÊf-|hÜ nÿö0( HÀ°®VÀÀ-ûg ?<^N¹. nÿö1n -n ÿö nÿöB!nÿüN^ _Þü NÐNAÿüB. J®gD-nÿü nÿüp°hf0p°¨WÀ€-ûg (°­úDWÀ"(²­úHWÁ‚úA N^.ŸNuNAÿðJ® WÀJ®WÁ‚g |`RU�/. Nºÿ~U�/.NºÿtÀg2 n"n )�¨ n "n ")’¨` -|N^NuNAÿø-n ÿüY�NºÿÌ //<N¹ AíðÚÐüÿêAð-Hÿø0.ã@2;Nû* nÿø0¼nÿÿ`" nÿø0¼1nÿþ` nÿø0¼!nÿüN^ _\ONÐNAÿòY�NºÿP //<N¹ AíðÚÐüÿêAð-Hÿö-n ÿò nÿöBh0¼=|ÿÿÿüRnÿü=|ÿÿÿúRnÿú nÿò0.ÿüHÀЀ2.ÿú4èBãJA°�WÀ@`B.N^ _PONÐNA| n "n)°(g NI8 n "n0)°hgNI`* nJ(f n "n)$°($g NIð nJ¨VÀ n J¨VÁÂg n "n )°¨g NIº nJ¨VÀ n J¨VÁÂg\ n hp°hf.U� n/( n /(HÂЂ$0"ãªpàªJ‚g„JnÿüWÀÿrçAÒnÿú=AÿþJ.g4"nÿö0.ÿþ2èAãI@tDÐ<áªF‚űtv᫇±`2 nÿöp�nÿþ2èAãI@tDÐ<áªF‚Űtv᫇° nÿúmÿD nÿümÿ0N^ _\ONÐNAÿô-nÿø nÿøp°PfD"n ¨ p2( HÁ-Aÿô°®ÿôn$-@ÿü nÿø .ÿü"n ".ÿü° '     ÿŒ/)/.ÿø?<N¹’ nÿ� (�®ÿø/?<Nº÷ê`,-øð×p�-ð×HzÎ/.ÿø?<N¹’/.ÿü?<Nº÷¼`Ö nÿ�Jh&WÀ€-ðÙg8-øð×p�-ð×"nÿŒ/)/.ÿø?<N¹’ nÿ�/(?<Nº÷t`Ž-øð×p�-ð× nÿ� (�®ÿø €ÿÿ€\À"(’®ÿø �ÿ_ÁÂg2"nÿŒ/)/.ÿø?<N¹’ nÿ� (�®ÿø/?<-h ÿô"nÿôp°i WÀr²©"\ÁÂpø°©"_ÀÀJ©"VÁÂg0J©"o 1nÿü` nÿô ("D€!@""n3nÿþ`P n"hJi f 1nÿø`6 nÿôp°h WÀ"n$ir²j VÁÂg 3nÿú` /.Nºþ~N^.ŸNuNAÿôBmðÊBmðÐB.ÿù n p°h WÀr0²nVÁÂg n"n 3h `L n p °h WÀNº÷`( nÿŒ/(/.ÿø?<N¹’ nÿ�/(?<Nºöä`ÒHnÿ–/<N¹ nÿ�"h"$nÿ–%i"h"#nÿ–-ÿÇð×pçˆ�-ð×-ÿøð×p�-ð×0-ðÊHÀЭé T€"nÿ–"€/(?<Nºö|`jHnÿ–/<N¹ nÿ�"h"$nÿ–%i"h"#nÿ–-ÿÇð×pçˆ�-ð×-ÿøð×p�-ð×0-ðÊHÀЭé T€"nÿ–"€/(?<Nºö nr²h WÁÂ0.HÀ/Hzh-AÿôN¹".ÿôÂg|ÿù n 1| 0.HÀЀAúíî-íðÖ00éˆ�-ðÖ0.HÀ/Hz(N¹_ðÙ0.ã@2;Nû–¬ò¤ðòúú„„„„„„„„„„„„„„„„ººººt„¾¾$òt„„„t„úútt„„tz t„„ð„„„„„„„„„„„„ .ÿüR€hÖ` ;|ÿøÿþNJN^ _ÞüNÐNAÿø n-hÿüY�Nºýº //<N¹ AíðÚÐüÿêAð-Hÿø nÿø0¼(øp�("nÿüJ©m i` nÿü <Ш"nÿø@ nÿüp°hWÀ"nÿøÿ©çˆ�))�0(éˆ�)©N^ _PONÐNAÿŒ-nÿ� nÿ�0( ã@2;NûP, ¶tÚ`N^.ŸNuNA0.HÀЀAúõ-õðÖ00éˆ�-ðÖ0.HÀ/HzÔN¹_ðÙ0.�|6ã@2;Nû0¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤j-ñðÖpãˆ�-ðÖmþ?ðÖpíˆ�mðÖ-ÿÇð×pçˆ�-ð×-ÿøð×p�-ð×`<-ñðÖpãˆ�-ðÖmþ?ðÖpíˆ�mðÖ-ÿÇð×pçˆ�-ð×-ÿøð×p�-ð×`?-ðÖN¹˜B ª²>ÌÜ;|ÿøÿþNJ`è-Çð×pçˆ�-ð× nÿ�-ÿøð×0(�-ð×`Ä-Çð×pçˆ�-ð× nÿ�-ÿøð×0(�-ð×` -Çð×pçˆ�-ð× nÿ�-ÿøð×0(�-ð×`|-Çð×pçˆ�-ð×-ÿøð×p�-ð×`^-Çð×pçˆ�-ð× nÿ�-ÿøð×0(�-ð×`:=mðÊÿ” nÿ�-ÿøð×0(�-ð×J(g-Çð×pçˆ�-ð×/(/ŠˆN^ _TONÐ $@@NAÿüBmðÊ0. HÀЀAúô -ôðÖ00éˆ�-ðÖ0. HÀ/HzÖN¹_ðÙ0. Q@ã@2;Nû����������������|||||ô|||||vÜÜ|||||^^||||ôô|–|¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾||||vê|ô<0. Q@-ððÖNºþ`H nÿ�J¨WÀJ¨"WÁÂg-Çð×pçˆ�-ð×` -Çð×pçˆ�-ð× nÿ�/(?<NºûÆ nÿ�J¨"gH0.ÿ”HÀЭé T€-@ÿø ("°­÷ÌfHz’/.ÿø?<N¹’` nÿ�/("/.ÿøBgN¹’`b-Çð×pçˆ�-ð×-ÿøð×p�-ð× nÿ�J("g ($Ш/?<Nºû8`N nÿ�-h$ÿŒ/($<PHnÿ¢/Nºüº0-ðÊ�-ðÖ-nÿü nÿüJh f*J¨l <Ш@ð×` nÿühð×`|ð× nÿü/(?<NºóÀ`Šp°n f-ñðÖpãˆ�-ðÖ`HpN°n f-ñðÖpãˆ�-ðÖ`,p2°n f-ñðÖpãˆ�-ðÖ`-ñðÖpãˆ�-ðÖ nmþ?ðÖ0( íˆ�mðÖ/.Nºö`-ñðÖpãˆ�-ðÖpK°n fmþ?ðÖpíˆ�mðÖHÀЭé T€-@ÿøHnÿ¢/.ÿøBgN¹’ nÿ�/(?<Nºúè`Ö-Çð×pçˆ�-ð×-ÿøð×p�-ð× nÿ�J("g ($Ш/?<Nºú¬`P nÿ�-h$ÿŒ/($<PHnÿ¢/Nºü.0-ðÊHÀЭé T€-@ÿøHnÿ¢/.ÿø?<N¹’ nÿ�/(?<NºúZ`H-Çð×pçˆ�-ð× nÿ�J(g"-øð×p�-ð× ($Ш//Nºü.`Ô-øð×p` npÐh S@mþ?ðÖíˆ�mðÖ-ÿÇð×pçˆ�-ð× n-øð×0(�-ð×`¢-ñðÖpãˆ�-ðÖp$°n WÀrTAmþ?ðÖ퉃mðÖ/.Nºõd`j-ñðÖpãˆ�-ðÖmþ?ðÖpíˆ�mðÖ-ÿÇð×pçˆ�-ð× n-øð×0(�-ð×B§?<NºòV` p,°n WÀrãA-ñðÖ㉃-ðÖmþ?ðÖpíˆ�mðÖ/.Nºôâ`è-ñðÖ�-ð× nÿ�J("g ($Ш/?<Nºùò`¦ nÿ�-h$ÿŒ/($<PHnÿ¢/Nºût0-ðÊHÀЭé T€-@ÿø nÿ� (�®ÿø €ÿÿ€\À"(’®ÿø �ÿ_ÁÂg.Hnÿ¢/.ÿø?<N¹’ nÿ� (�®ÿø/?<Nºùp`$Hnÿ¢/.ÿø?<N¹’ nÿ�/(?<NºùJ`8-Çð×pçˆ�-ð×-ÿøð×p�-ð× nÿ�/("?( Nºù` nÿ�pãˆ�-ðÖmþ?ðÖpíˆ�mðÖ/.Nºôº`À-?ð×píˆ�-ð×p7�n D@-ððÖ�-ðÖ/.NºôŽ`”-ñðÖpãˆ�-ðÖmþ?ðÖpíˆ�mðÖ n ("l^€æ€-Çð×çˆ�-ð× n ("€-øð×�-ð×`B-ñðÖpãˆ�-ðÖmþ?ðÖpíˆ�mðÖ-ÿÇð×pçˆ�-ð× n-øð×0(�-ð×`?-ðÖN¹Šˆp°mðÊf?-ðÌN¹Šˆ`-h"ÿŒ-Çð×pçˆ�-ð×0-ðÊHÀЭé T€-@ÿø"nÿŒJ)g. (Щ -@ÿü .ÿü�®ÿø-@ÿô ®ÿÿ€ÿô\À ®ÿÿô_ÁÂ-ðÙ@Àg-øð×p�-ð×/.ÿô?<Nºø�`Ò nÿ�Jh&WÀ€-ðÙg0-øð×p�-ð×Hzb/.ÿø?<N¹’/.ÿü?<NºøP`’ nÿ� (�®ÿø €ÿÿ€\À"(’®ÿø �ÿ_ÁÂg>-øð×p�-ð×"np°mðÊf /-ðÌN¹Š´N^ _\ONÐ $@@NAÿü n-hÿü"nÿümþ?ðÖ0) íˆ�mðÖp°i g<0-ðÖ숀X€mþ?ðÖíˆ�mðÖ$h -ñðÖ0*ãˆ�-ðÖ/(NºóJ`" nÿü-ÿñðÖ0(ãˆ�-ðÖ"n/) Nºó&N^.ŸNuNAÿô nJhf=|ÿø=|ÿú=|ÿü=|Jÿþ`=|Hÿø=|Iÿú=|Jÿü=|ÿþ n(     „„„„„„l¬ò¤/Nºý¢Jng`ÿ`Ú-nÿô nÿô-ÿñðÖ0(ãˆ�-ðÖp°h WÀråAVAmþ?ðÖ퉃mðÖ/. Nºðl`”p°nf-ñðÖpãˆ�-ðÖ`Hp!°nf-ñðÖpãˆ�-ðÖ`,p°nf-ñðÖpãˆ�-ðÖ`-ñðÖpãˆ�-ðÖ nmþ?ðÖ0( íˆ�mðÖ n p °h WÀ nr²h WÁÂÿ¼-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú`¶Aîþ¼CúÒEÐÀÙSbú<ÿHPHz®-Hþ¸N¹ nþ¸<þÿHPHnÿ¼-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú`^Aîþ¼CúzEÐÀÙSbú<ÿHPHzZ-Hþ¸N¹ nþ¸<þÿHPHnÿ¼-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú`Aîþ¼Cú2EÐÀÙSbú<ÿHPHz-Hþ¸N¹ nþ¸g n 1| /. NºïÂ/.Nºïº`â n ("€-ñðÖãˆ�-ðÖpJ°nWÀråA nÒh mþ?ðÖ퉃mðÖ/.Nºïn`–/Nºûº`Œp°nWÀr(²nWÁ‚­ðÖƒ-ðÖp°n]À-Çð×çˆ�-ð×-nÿô nÿô-ÿøð×0(�-ð×-ÿ?ð×0( íˆ�-ð×-n ÿô nÿôp°h f ("€-ñðÖãˆ�-<þÿHPHnÿ¼-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú`®Aîþ¼CúÚEÐÀÙSbú<ÿHPHz¦-Hþ¸N¹ nþ¸<þÿHPHnÿ¼-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú`VAîþ¼Cú‚EÐÀÙSbú<ÿHPHzR-Hþ¸N¹ nþ¸<þÿHPHnÿ¼-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú/-÷üHnÿ¼N¹LN^.ŸNu)refdefcodeErrðÖ`0 nÿô-ÿñðÖ0(ãˆ�-ðÖ-ð׿ˆ€X€-Çð×çˆ�-ð×`Ì n p°h f n -ñðÖ0(ãˆ�-ðÖíðÖ`&-ñðÖpãˆ�-ðÖ­ðÖ n /("?<NºëŒ0.�|ã@2;Nû,>-?ð×píˆ�-ð×`4-?ð×píˆ�-ð×`"-?ð×píˆ�-ð×`-?ð×píˆ�-ð×/.Nºíê` n-ñðÖ0(or opening Error writing  file, ioresult(NAÿþJ­øf¼J-é�fbHmçø?<HméHz®N¹HmçøHz¢N¹Hmçø<þxHmé<ÿHmêb<ùHmê\N¹J­ÿêg?<‡?-ÿìNºüˆ|üé� -élмÿr â 2-éHÁÒ€=AÿþY�Hmçø/-é/<0.ÿþHÀ/<ÿN¹p°Ÿg?<Š?-ÿìNºü0+mé éN^Nuãˆ�-ðÖp°nfmþ?ðÖpíˆ�mðÖ`mþ?ðÖpíˆ�mðÖ/. Nºí `È-nÿô nÿô-ÿñðÖ0(ãˆ�-ðÖJh f&p°h WÀråAVAmþ?ðÖ퉃mðÖ` nÿômþ?ðÖ0( íˆ�mðÖ/. Nºí:`b-nÿô n -øð×0(�-ð×-ÿÇð×pçˆ�-ð× nÿôpÐh mþ?ðÖíˆ�mðÖ-ÿñðÖ0(ãˆ�-ðÖ` np°h f6PURGENAÿü|ÿðÉ -é �­élмÿr â R€=@ÿü -é �­é€ÿ=@ÿþ mé0.ÿüHÀr ã 2.ÿþHÁÒ€Aèþ® R­é p°nÿüWÀ nÿÿþWÁÂgNºþ´N^ _TONÐNAÿþ=nÿþp.ÿþ?Nºÿnp.ÿÿ?NºÿbN^ _TONÐNAÿú-nÿú=|ÿÿÿþRnÿþ0.ÿþr6ú?Nºÿ4 nÿþmäN^.ŸNuNAýüJ® \ÀJnVÁÂg< .-n ÿô nÿôp°h f"p€°¨"_Àr²¨"\ÁÂg =|0`û np°h VÀ nJh VÁtãBrÔA-ðÖ銅-ðÖ/. Nºìf-ð׿ˆ€=@ÿú-ð×€=@ÿü/.Nºì@-ð×mþ?ðÖçH@À�mðÖ-ð×-ÿñðÖãÿ�-ðÖ-ÿÇð×0.ÿúçˆ�-ð×-ÿøð×0.ÿü�-ð×p.°nf-øð×p�-ð×` -ðÖp °­émt . �­é€ÿ=@ýü . �­élмÿr â R€=@ýþ mé0.ýþHÀr ã 2.ýüHÁÒ€"mé0.ýþHÀt å 4.ýüHÂÔ€Céþp1(ÐnAèþ€`¾ . lмÿr â 2-éHÁÒ€=Aýþ . €ÿ=@ýüY�HmçøHnþ/<0.ýþHÀ/<ýN¹p°Ÿg+|ÿê;|ÿöÿþNJ0.ýü2.ýüAîþt0ÔnAîþ‚Y�éˆ�-ðÖ np°h WÀrTAmþ?ðÖ퉃mðÖ np°h f6-ñðÖpãˆ�-ðÖ/. n p°h WÀNºé8/. Nºër`2-ñðÖpãˆ�-ðÖ/. np°h WÀNºé/.Nºë>`f n-ñðÖ0(ãˆ�-ðÖ­ðÖ-n ÿô nÿôJ¨"m h%ð×` nÿô <Ш"@ð×`/Nº÷ÌpG°ng`ùB`HmçøHnþ/<0.ýþHÀ/<ýN¹p°Ÿg+|ÿê;|ÿöÿþNJN^ _\ONÐNAûôJ­øfLJ® \ÀJnVÁÂg: . °­émê . �­é€ÿ=@ûö . �­élмÿr â R€=@ûø mé0.ûøHÀr ã 2.ûöHÁÒ€Aèþpûô . �­éR€€ÿ=@ûú . �­éR€lмÿr â R€=@ûü mé0.ûüHÀr ã 2.ûúHÁÒ€Aè?-ðÖN¹ŠˆBnÿþRnÿþ0.ÿþÁüAíðÚÐüÿêAð-Hÿô nÿôp°Pf?(N¹Šˆ` nÿôp°Pf /(N¹Š´ nÿþm¬J.ÿùg n 1| N^ _Þü NÐ $@@ $@@NuNAB-ðÈ+|ÿÿÿÿåÄ;|é;|å¬N^NuNABmöè+n÷ÌB-ðÉB­é B­é0-éR@;@é+|êfB­êjBmçöBmçô;|å*Bmæàþpûõ0.Ñnûô mé0.ûøHÀr ã 2.ûöHÁÒ€Aèþ®ûô mé0.ûüHÀr ã 2.ûúHÁÒ€Aèþ®ûõ`F . lмÿr â 2-éHÁÒ€=Aûø . €ÿ=@ûö nÿûöl =|ûþ`=|ûþY�HmçøHnü0.ûþHÀ/0.ûøHÀ/<ûN¹0.ûþHÀ°Ÿg+|ÿê;|ÿöÿþNJ0.ûöAîüpûô0.ûöR@lÐ|ÿr â`R@=@ûü0.ûöBmæÞHzB§?<BgN¹“PN^.ŸNu_BASENAþ´?. N¹.|ÿô< HnÿôAîÿð ¼HP?.?<N¹Aîþ¼Cú¼EÐÀÙSbú<ÿHPHnÿô-Hþ¸N¹ nþ¸<þÿHPHz^-Hþ´N¹ nþ´CÐAîÿ¼ÀÙSbú0. �|‡ã@2;Nû d¼lÄAîþ¼Cú*EÐÀÙSbú<ÿHPHz-Hþ¸N¹ nþ¸<þÿHPHnR@@ÿ=@ûú0.ûüHÀr ã 2.ûúHÁÒ€Aîúpûõ0.Ñnûô0.ûöAîü®ûô0.ûüHÀr ã 2.ûúHÁÒ€Aîú®ûõY�HmçøHnü0.ûþHÀ/0.ûøHÀ/<ûN¹0.ûþHÀ°Ÿg+|ÿê;|ÿöÿþNJN^ _\ONÐNAÿö .lмÿr â 2-éHÁÒ€=Aÿø .€ÿ=@ÿö n0.ÿø°hûüg00(ûüR@°nÿøVÀ nÿÿöWÁ‚gÂJhûüg(     þþRnþþ0.þþ mçð2-çôCîþú±Rmçô mÿçôo/NºýØ nþþmÊp°n fJ0.R@HÀ-@þú=|þþRnþþ0.þþ mçð2-çôCîþú±Rmçô mÿçôo/Nºý† nþþmÊN^ _Þü NÐ_NAÿR nCîÿ\ÀØSbú nCîÿ®ÀØSbúAîÿ®"m÷ÌpR@± fS@fö=|ÿZ`è=|ÿZB.ÿW=|ÿX0.ÿX°må*]À.ÿW n pT@lR@â@X@HÀ/N¹p n r=Aÿò°nÿòn&=@ÿô n 0.ÿô"nÿü"Q2.ÿô°0.ÿôR@hÔ nÿü PB�|ÿÿû nÿü-PÿüJ.ÿûgÿ4-nÿöN^ _PONÐNAÿ¨ -åÈlмÿr â 2-éHÁÒ€R�;Aå¾0-çöHÀr ã 2-çôHÁÐ�+@å²Jmçög‚JmçôoY�Hmæâ/-çð/<0.ÿþR@HÀ/<ÿN¹p°Ÿg+|ÿê;|ÿöÿþNJ0.ÿþR@hÿjp2-å*SA=AFY�HmçøHhü0(ûþHÀ/0(ûüHÀ/<ûN¹ n0(ûþHÀ°Ÿg+|ÿê;|ÿöÿþNJ nÿÿöl n1|ûþ` n1|ûþ n1nÿøûüY�HmçøHhü0(ûþHÀ/0(ûüHÀ/<ûN¹ n0(ûþHÀ°Ÿg+|ÿê;|ÿöÿþNJ`V np°hûþgHY�HmçøHhþ/<0(ûüR@HÀ/<ûN¹p°Ÿg+|ÿê;|ÿö-HÿüBP1|Bh"mø"Qp°d "mø"Q¼ø mø PCÐ$nÿüAêÀÙSbú0*S@5@0-å¬S@5@Bj5m÷ÔY�Hmçø/-å®/<B§<N¹p°Ÿg+|ÿê;|ÿöÿþNJN^.ŸNuNAÿüJnWÀÀ-ðÈJ­øWÁÂgL/Nºÿ>HmçøHz˜N¹J­ÿêg ;|ÿöÿþNJ-müœÿü nÿü|ÿ CíéEèÀÙSbú`8ÿþNJ n1|ûþpÐnÿø n�hûü=@ÿø0.ÿöR@lÐ|ÿr â`Ðnÿø=@ÿü0.ÿöR@@ÿ=@ÿú0.ÿøHÀr ã 2.ÿöHÁÒ€Cèúqÿþ0.ÿüHÀr ã 2.ÿúHÁÒ€Cèúqÿÿ0. Ñnÿþ0.ÿøHÀr ã 2.ÿöHÁÒ€Cèú®ÿþ0.ÿüHÀr ã 2.ÿúHÁÒ€Cèú®ÿÿN^ _Þü NÐNA nJhûügFY�HmçøHhü0(ûþHÀ/0(ûüHÀ/<ûN¹ n/-ÿ¦N¹/-ÿ¦/HzT?<?<ÿÿN¹N¹HmçøHz2N¹HmåÌHz$N¹HmæâHzN¹N^ _TONÐlockpurgeNo codefile generated.NAÿüJ­øfÔ -é �­éмÿlмÿr â =@ÿüJnÿüo® -élмÿr â 2-éHÁÒ€=AÿþJ-é�fNHmçø?<HméHz~N¹HmçøHzrN¹Hmçø<þx0(ûþHÀ°Ÿg+|ÿê;|ÿöÿþNJN^.ŸNuNAûøJ­øf„BnûüJ®gr-nûø nûøpÿ°�gT -é �� €ÿo?<ŸN¹.`6 nûø °­ém/ -é ��?Nºúº` nûø/ -é ��?/Nºý nûø-h`ˆ/NºÿN^.ŸNuNAY�HmåÌ/-æÚ/<0-æàHÀ/<ýN¹p°Ÿg?<‹?-ÿìNºô0RmæàBmæÞN^Hmé<ÿHmêb<ùHmê\N¹|é�Y�Hmçø/-é0.ÿüHÀ/0.ÿþHÀ/<ÿN¹0.ÿüHÀ°Ÿg?<Š?-ÿìNºìÊN^NuPURGENAÿüJ­øWÀÀ-ûgpBnÿþRnÿþ0.ÿþAúfÐüÿÿr0?Nºðp nÿþmÜp nr=Aÿü°nÿün"=@ÿþ n0.ÿþr0?Nºð:0.ÿþR@hØ?<;Nºð*?< Nºð"N^.ŸNuMODULE NAÿúJ­.ŸNuNAÿ¦ nCîÿ®ÀØSbúJ­øfØ<PHnÿ®N¹¶ mæÚ0-æÞ®ÿ®RmæÞ mÿæÞo/Nºÿjpr.ÿ®=Aÿ¦°nÿ¦n4=@ÿ¬0.ÿ¬ mæÚ2-æÞ¶®RmæÞ mÿæÞo/Nºÿ,0.ÿ¬R@hÆ mæÚ0-æÞ® RmæÞ mÿæÞo/Nºÿ-n ÿ¨=|ÿÿÿ¬Rnÿ¬0.ÿ¬ mæÚ2-æÞ¶¨RmæÞ mÿæÞo/NºþÌ nÿ¬mÎN^ _ÞüøWÀÀ-ûg0-ÿþ�m÷ÀS@=@ÿü -é lмÿr â 2.ÿüHÁÒ­é T�lÒ¼ÿt ä¡°�]À"-é lÒ¼ÿt ä¡Â<Àg?< Nºï¤BgNºïž -é lмÿr â 2.ÿüHÁÒ­é R�lÒ¼ÿt ä¡°�lD -é R€lмÿr â 2.ÿüHÁÒ­é R�lÒ¼ÿt ä¡°�l ?< Nºï8`Æ?< Nºï.0-÷À2-ÿþSA=Aÿú°nÿún&=@ÿþ0.ÿþAí NÐNAY�Hmæâ/-çð/<0-çöHÀ/<þN¹p°Ÿg?<Œ?-ÿìNºòæRmçöBmçôN^.ŸNuNAýð nCîÿÀØSbúJ­÷ÄgXAîýø"m÷ÄEÑCÐÀÚSbú<÷ÿHPHz-HýôN¹ nýô<ýÿHPHnÿ-HýðN¹ nýðCÐAîÿÀÙSbúJ­øfÀ mçð0-çô®ÿRmçô mÿçôo/Nºÿpr.ÿ=Aþö°nþönÐüû¨r0?Nºîü0.ÿþR@hÔN^NuNAJ­øWÀÀ-ûgÖ -é lмÿr â "-é \�lÒ¼ÿt ä¡°�]À"-é lÒ¼ÿt ä¡Â<ÀgBgNºî– -é lмÿr â "-é \�lÒ¼ÿt ä¡°�l ?< Nºîf`Î?<ENºî\?<NNºîT?<DNºîL?<;NºîD?< NºîZZZZZZZZZZZZZZZL nÿüBh ` nÿü1| ` nÿü1| ` n ÿê$nÿêJ*gr&nÿò(Sp°”g((h ,ÿüÀ<ÿÿrçAÒj A=Aÿö` nÿê=h ÿö nÿê/( "nÿîHi<?.ÿö$h ?*$n/*N¹¹ `& nÿê/( "nÿîHiB'BgBg$n/*N¹¹ n"hÿö!Qÿö`ÿ. n h .ÿü°¨ÿüo/Nºøê n h .ÿü°¨ÿüo8p".ÿü’¨ÿü-Aÿî°®ÿîn-@ÿøBgNºÿü1| N^ _Þü NÐNAÿü?.?.?. nHh"NºþH-nÿü0. Q@ã@2;Nû2ZZZZZZZ>ZZZZZZZZZZZZZZZL nÿüBh ` nÿü1| ` nÿü1| ` nÿü1| N^ _Þü NÐNAÿþ nJhÿøo>p°hÿøl?(ÿúNºØ² nT¨ÿü` n=hÿúÿþp.ÿþ?NºØ nR¨Ñ .ÿøR€hæ n h!nÿüÿüN^.ŸNuNAþÊ n-Xÿú=PÿþJ®g¼ np°hf n-h nJhf¸J.g/.ÿü/Nºù4`ž .°­úTWÀ".²­úPWÁ‚g?.ÿþ/Nºø‚`v .°­úDf./.Nºø n(ÿÿg Bg/NºøT/.ÿü/Nºø¦`>/.Nº÷Þ n(ÿÿg Bg/Nºø(J.ÿúg?.ÿþ/Nºÿü nBhÿúBhÿøN^.ŸNuNA n/(Nºÿ’?. Nº×Þ n hR¨ÿüN^ _\ONÐNA n/(Nºÿd?. NºØ. n hT¨ÿüN^ _\ONÐNA n/(Nºÿ6/. NºØ, n hX¨ÿüN^ _PONÐNAÿô nJhf./(Nºÿ np°h l"h)ÿÿg Bg/Nºÿ< np°hnh n0(Ðh "høD` ;|ÿøÿþNJ`â np°hf2/.Nº÷� n(ÿÿg Bg/Nº÷Ú nX¨ÿüB§NºÐj`¤ np°hfH/.Nº÷R n(ÿÿg Bg/Nº÷œ nÿüL¨ H®ÿà/.ÿà/Nº÷Þ/.ÿä/Nº÷Ô`PJ®ÿügH-nÿüþÒ nþÒ0S@m,°|n$ã@2;NûŠÌô J¨gv-hþÎ"nþÎJ‘gf$Q0*]@ã@2;3@ÿøp °iÿøl6/ Nºþ¤ n h(ÿÿg Bg/.Nºþè nBh"h3h ÿø np °h obJ® l ®€ np°h oD-|ÿøp2( HÁ-Aÿô°®ÿôn-@ÿü .ÿøÑ®ÿø .ÿüR€hä/. /.ÿøN¹-_ -n ÿø n hp�hÿøHÀ-@ÿüJ®ÿül/.þìNºÇ6 nÿú-hÿú`À/NºýªN^NuNAÿô=|ÿÿÿüRnÿü=|ÿÿÿþRnÿþJnÿüWÀ2.ÿþHÁ/Hmé–-@ÿøN¹ .ÿøÀf\0.ÿüÁü 2.ÿþÃü4Ò€AíðÊÐüù¤Að-Hÿô nÿôBPB¨ÿü nÿüJPf$p°hf"hLè HÑ nÿü1|N^ _TONÐNAÿþ=|ÿÿÿþRnÿþ?.ÿþNºÿš nÿþmìN^NuNAÿü n-hÿü nÿüp°h WÀJ¨WÁÂJh WÀÀJ¨"WÁÂ(@À@ N^.ŸNuNAÿò-n ÿö nÿö-hÿò"nÿò=i ÿþ-Qÿú$n$j&hLÒHÓ nÿò1nÿþ ®ÿúN^ _PONÐNAÿô n pp°hWÀ.AÀg"hLè HÑ nÿô1| nÿþmÿt nÿümÿ`;|ë¦+|ÿÿÿë¨Bmë¬;mé®ë®;|ër+|ÿÿÿëtBmëx;|ëz;|ëÚN^ _TONÐNAÿü . ‘­û.-û1gS­û. -û.°­û2l+mû.û2-nÿü nÿü1| p°mé®f1|!m÷Ì"` nÿü1|B¨" nÿü!mû.B(B(Bh N^°hf n -h . °­úTVÀ". ²­úPVÁ nAN^ _PONÐNAÿ¸-nÿÄ nÿÄ-hÿÀ"nÿÀJ)g=|ÿ€ÿÔ=|ÿÖ`=|€ÿÔ=|ÿÿÖ nÿÀp°h WÀJ¨"VÁÂ0( HÀ/HzÞ-Aÿ¼N¹".ÿ¼‚ nÿÀÂ(0.ÿÔHÀ°¨^À€2.ÿÖHÁ²¨]Á‚g hÿÉB(=h ÿÎBh ¨ÿ^À ¨ÿÿ€]Á‚J¨" _PONÐNAÿü0. Áü 2.Ãü4Ò€AíðÊÐüù¤Að-HÿüJn WÀ nÿür²hVÁÂgJ¨o S¨` ;|ÿøÿþNJ nÿüJ¨WÀr²hWÁ‚p°PVÀÀgBPN^.ŸNuNAþžp°nf4=|ÿÿÿþRnÿþ0.ÿþÁü4AíðÊÐüûDJpf`n nÿþmØ` JnfÊ=|ÿÿÿú=|ÿÿÿü=|ÿø=|ÿÿÿþRnÿþ0.ÿþÁü4AíðÊÐüù¤AðVÀJ¨VÂÄ„g-hÿÐB¨`B®ÿÐU�/.Nºþ2Jf/.<N¹g.`¢ nÿÀ0(Áü4CíðÊÒüù¤Cñ-Iÿ¸"nÿ¸p°igxp°©lHBgHnÿØNºùø nÿÀ=h ÿÌ?<&"nÿÄ/)HnÿØN¹}¸ nÿÀ1nÿàB¨B¨"1nÿÌ `( nÿ¸p°hf"hLè HÑ nÿ¸1|J®ÿÐgv nÿÀ=h ÿÊBh =h ÿÌ-Hÿô nÿôJPfD0(ã@2;Nû.``( nÿô0(°nÿøl=nÿþÿü=hÿø`=nÿþÿú nÿþm�Jnÿüm=nÿüÿþ?.ÿþN¹Êæ`¶`Jnÿúm=nÿúÿþ?.ÿþN¹Êæ`–`:p°nf0=|ÿÿÿþRnÿþ0.ÿþÁü4AíðÊÐüüäJpf`b nÿþmØ?<¬AîþøCú|EÐÀÙSbúHnþ¦/-é²-Hþ¢N¹ÑP nþ¢< ®ÿÿ€ÿÐ]À ®ÿÿÐ^Á‚g 1| ` nÿÀ1| =|ÿø-nÿÐÿú?<HnÿØ n/(N¹}¸ nÿÀ1nÿÌ 1nÿÊ nÿÀnÿÉ1nÿÎ N^.ŸNunNAÿü-nÿü nÿüp°h f?<?(Nºöj`€ nÿüp°h f&?<?(NºöL?< nÿü0(R@?Nºö8`N nÿü0( HÀ/Hmé’N¹Jg2 nÿüp°h f *     ÿü nÿü0( °ng6p°h WÀ"n"ir²i WÁÂg /.N¹l$/. ?.NºýþN^ _Þü NÐNA n h1| p°mé¢fL/. B'N¹g. n hBh ?< n/( n /(N¹}¸Bg n h?(N¹Å`?<! n /( n/(N¹}¸ n/(N¹Î|N^ _Þü NÐNA/.NºüØ/. NºüÐÿümÿ@ nÿþmÿ,Jmê gp0-ê HÀå€/Hmê4N¹Ä„;|ê@p°mê f4;mêêJmêf Bmê,`;|ê,?<*Hmê Hmê4N¹}¸`;|ê,?</Hmê Hmê4N¹}¸N^NuNAJmê o:;|êp°mê l?</Hmê4Hmê N¹}¸`?<*Hmê4Hmê N¹}¸Jmû fN¹UÜN^NuNA/.N¹dŒ/. N¹dŒN^ nJPgp n JPgT n h1| /. N¹l$?< n/( n /(N¹}¸ n/(N¹Î| n /(N¹Î|`/./. /Nºþà`/. /./NºþÎN^ _Þü NÐNAÿè-nÿì nÿì"h"ip°if/(/(/Nºÿ. n B`LB.ÿÿ nÿì"h$h0°Qo/(Nºûæ nÿì/(NºûÚ` nÿì/( _Þü NÐNAÿø-nÿü nÿü-hÿøJ. g"nÿø3| ` nÿü"h//(N¹Ä„/.N¹dŒN^ _Þü NÐNAÿü-nÿü nÿü0( mÔ°| nÌã@2;Nû::ÀÀÀÀ‚:^/.B'/Nºÿb nÿü/(/(/Nºÿ,`�/.</Nºÿ> nÿü/(/(/Nºÿ`l/.</Nºÿ nÿü/(/(/Bg?(Nºö nÿüJ(g?<?(NºõèN^.ŸNuNA . °®l -n `-nN^ _PONÐNA/. /.N¹ . �Ÿ//.N¹-_N^ _PONÐNAÿô-n ÿü nÿü-hÿøCè-Iÿô"nÿôp€°©_Àr²©\ÁÂg$nÿøBj |`š nÿôJ¨\À ¨ÿ_ÁÂg"nÿøBi B)`p nÿô ¨ÿÿNºûÊ nÿì/(Nºû¾ nÿì/(N¹Z nÿì/(N¹Z nÿì"h-iÿè"nÿè=i ÿú=i ÿöiÿô"h-iÿè"nÿè=i ÿü=i ÿøiÿõp°nÿüf˜|ÿþ=|!ÿð/(?.ÿö.ÿôN¹Ï† nÿì"h-iÿè"nÿè=i ÿøiÿõp°nÿüfNJ©"WÀr ²nÿúVÁÂg |ÿÿ`0 nÿèp€°¨"_Àr²¨"\ÁÂg"nÿì/)€\À ¨ÿ_ÁÂg"nÿø3| |`> nÿôJ¨\À ¨ÿÿ_ÁÂg"nÿø3| B)` nÿø1| | nÿø0. °h oB"nÿôJ©]À.AÀg0. R@1@ |` nÿø1n n`’ nÿø0. °h f‚(@À.g0( R@1@ |`^.@ nÿøÀ(g."nN¹l$=|ÿð`ªp°nÿúfšB.ÿþ=|!ÿð nÿì/(?.ÿø.ÿõN¹Ï† nÿì"h-iÿè"nÿè=i ÿöiÿôp°nÿúfNJ©"WÀr ²nÿüVÁÂg |ÿÿ`0 nÿèp€°¨"_Àr²¨"\ÁÂg"nÿì/)N¹l$=|ÿð`=|ÿð0.ÿö°nÿøWÀ.ÿô².ÿõWÁÂg nÿôÿó`¼p°nÿøf&|ÿóp°nÿög nÿì/(ÿôJ©l0( R@1@ |` nÿøB(` nÿøJ(f0( R@1@ |N^ _PONÐNAþ¦Aú¬Cîÿ®ÀØSbú|ÿÿªJ®ot/./< N¹ =@ÿ¬/./< N¹-_p0Ðnÿ¬@ÿ«AîþªCîÿªEÐÀÙSbú<ÿÿHPHnÿ®-Hþ¦N¹ nþ¦CÐAîÿ®ÀÙSbú`†Aîÿ®$n CÒÀØSbúN^ _PO?<Nºú<`Žp°nÿöf*|ÿóp°nÿøg nÿì/(/(?<Nºû¼`\p°nÿøWÀÀ.ÿõJnÿöWÁÂg|ÿó nÿì/(?<NºùØ`*p°nÿöWÀÀ.ÿôJnÿøWÁÂg |ÿó nÿì/(/(?<NºûT`ôJnÿöWÀ.ÿôAÂgPJ.ÿõg0|ÿó nÿì/(?<Nºùl nÿì/(/(?<Nºû `B.ÿó nÿì/(?<NÐNAB-ðÇAú²CíêbÀØSbúAú¢Cíê\ÀØSbúBmï~;|ïf;|ïj;|ï¦;|ïŽB-ï”B­ï¨BmïÎ;|ï¶;|ïº;|ïö;|ïÞB-ïäB­ïøBmð;|ð;|ðF;|ð.B­ð*B-ð4B­ðH;|ðn;|ðV;|ð–;|ð~;|ð¾B­ðÀN^Nu.CODENuNAÿü/.N¹Dd n-hÿü nÿüJ(g /.N¹^ê nÿüNºù@`’JnÿøWÀ.ÿõAÂgTJ.ÿôg0|ÿó nÿì/(?<Nºù nÿì/(/(?<Nºú¨`B.ÿó nÿì/(/(?<NºúŒ`,|ÿó nÿì/(?<NºøÀ nÿì/(/(?<Nºú^p!°nÿðg0 nÿì"h"ip°i VÀ@ÿþJ.ÿþg /(N¹l$J.ÿþgˆJ.ÿÿf$?.ÿð nÿì"h/)"h/)N¹}¸`p°h f/.B'N¹g.` /.N¹Ì> nÿüJ(g /.N¹`¾N^.ŸNuNAÿÐ/. N¹Dd-n ÿÔ nÿÔ-hÿÐ"nÿÐJ)g /. Nºÿ\ nÿÐp°h f/. ?.<N¹Ï† nÿÐ0( °ngH0.°h oÒJ(fŽ?<HnÿØN¹Çx?<0HmðžHnÿØN¹}¸/. Nºþð nÿÐ=h ÿä?<*"nÿÔ/)HnÿØN¹}¸Z nÿì"h"ip°i VÀ"hr²i WÁ‚"hp°i WÀ"h"i)BÄ„g?<N"h/)N¹x`„J.ÿÿf$?.ÿð nÿì"h/)"h/)N¹}¸`Z nÿì"h"ip°i VÀ"hr²i WÁ‚"hp°i WÀ"h"i)BÄ„g?<N"h/)N¹x nÿì"h/)N¹Î| nÿì"h/)N¹ nÿÔ/(N¹Î| nÿÐ1| 1nÿà|ÿJ-å)g=nÿä?<NHnÿØN¹x`:/. N¹l$ nÿÐ0( °nl 0( R@1@ ?<#"nÿÔ/)N¹x`Ò`b nÿÐp°h f/. N¹l$` /. Nºþ, nÿÐp°h f R¨`(p°nf nÿÐT¨`Jnf nÿÐV¨ nÿÐ1n N^ _\ONÐNAÿü n -hÎ| n ®ÿþ n®ÿóN^ _Þü NÐNAÿüJmû fN¹TTBmê =|ÿÿÿþRnÿþ=|ÿÿÿüRnÿü0.ÿþÁü 2.ÿüÃü4Ò€AíðÊÐüù¤p°pfTRmê 0.ÿþHÀЀ2.ÿü4èBãJAHÂЂAíê\ÐüÿÒtDÒ<ÿãªF‚Űtv㫇°;nÿþê;nÿüê`@0.ÿþHÀЀ2.ÿü4èBãJAHÂЂAíê\ÐüÿÒtDÒ<ÿãªF‚Űtv㫇° n+     Nºþä`H/.</Nºþö nÿü/(?<Nºô nÿü/(N¹k nÿü/(N¹dŒ` ;|ÿøÿþNJNºüÐN¹Ë8 n0( ã@2;NûP^zzzzlBB4&Hz®N¹©x`VHz„N¹©x`HHzVN¹©x`:HzvN¹©x`,HzDN¹©x`Hz@N¹©x`HzN¹©x`Nºý¨N^.ŸNuASM_XIN ASM_UNIONNû$Bmð‚`;|ð‚` ;|ð‚` nÿ¤p°hf(=|ÿðU�"n "i"i0)HÀ/N¹É¸=_ÿØB.ÿÞB®ÿò nÿ¤-hÿ "h$n$j °‘f�p°mð‚f"nÿ $i *X€-@ÿÔ` nÿ "h )T€-@ÿÔ?<*HnÿÐHmðvN¹}¸p°mð‚f Y®ÿÔ`U®ÿÔ?<*HnÿÐHmðvN¹}¸ nÿ "P-iÿÔ?<* ASM_EQUAL ASM_NEQUAL ASM_INTERSECT ASM_INCLUSIONASM_DIFFERENCENAJ-é¦g ?<MN¹wN^NuNAÿÐ/.N¹DdBmð‚-nÿÔ nÿÔ-hÿÐ (°­úhf("nÿÐX©?<*/(HmðvN¹}¸ nÿÐY¨`,=|ÿø nÿÔ"h0)$HÀ-@ÿú?<*HnÿØHmðvN¹}¸/.N¹dŒN^.ŸNuNAÿÐ-nÿÐU� nÿÐHnÿÐHmðvN¹}¸`@=|ÿÈ=|ÿ´U�?<N¹Åˆ=_ÿ° nÿ¤"hp°‘f"nÿ $i *X€-@ÿÔ` nÿ "h )T€-@ÿÔ?<*HnÿÐHnÿ¨N¹}¸=|ÿ´?<#Hnÿ¨N¹x?<*Hnÿ¨HmðvN¹}¸ nÿ¤"hp°‘f Y®ÿÔ`U®ÿÔ=|ÿ´?<*HnÿÐHnÿ¨N¹}¸=|ÿ´?<#Hnÿ¨N¹x?<*Hnÿ¨HmðvN¹}¸ nÿ "P-i"h/)N¹b¦Jg nÿÐ/(NºÿB`L=|ÿø nÿÐ"h"i/)HnÿÔHnÿúN¹jÐ;|ð‚?<*HnÿØHmðvN¹}¸ nÿÐ/(N¹dŒ nÿÐ/(?<NºñÆ nÿÐ/(N¹k nÿÐJ¨g/(?<Nºñ  nÿÐ/(N¹kN^.ŸNuNAÿü n"n 0) °h g B.`ä n 0( mÔ°|*nÌã@2;NûVVVVÿÔ=|ÿ´?<*HnÿÐHnÿ¨N¹}¸=|ÿ´?<#Hnÿ¨N¹x?<*Hnÿ¨HmðvN¹}¸?<?.ÿ°N¹ÅHnÿÐN¹Î|` =|ÿÈ nÿ¤"hp°if -h ÿÊ`& nÿ¤J(g0( HÀ-@ÿÊ` nÿ¤-h ÿÊ nÿ¤/(HnÿøHnÿüN¹jÐ?<.Hnÿ¨HmðvN¹}¸-nÿüÿÊ?<.Hnÿ¨HmðvN¹}¸-nÿøÿÊ?<.Hnÿ¨HmðvN¹}¸N^ _VVVVVVVVVVVVVVVV’’’’’’’’’’’’’’’’°ÎÀÀ HzU� n /( n/(NºÿXU� n /( n/(NºÿBÀÿ@`4U� n /( n/(Nºÿ_` n"n )°¨WÀ@`øU� n /( n/(NºþàU� n /( n/(NºþÊÀþ@`Þü NÐNAÿÈJ® g�-n ÿÐ nÿÐp°h$WÀÀ-é¨g"n/)/( <N¹\ nÿÐp°h$f"n/)N¹dŒ` nÿÐp°h$WÀr²h$WÁ‚g"n/)N¹dŒ`ð nÿÐp°h$f"n/)Nºõ¸`Ò nÿÐp °h$f "n /) "n"i/)/Nºûè`¦-nÿÌ-n ÿÈ nÿÈp°hf -h ÿü` n¼ n"n )°¨WÀU� n /( n/(-@ÿüNºþŽ .ÿüÀÿ@`~ n"n )°¨WÀ n"n ")²¨WÁÂA`L n J(g4 nJ(g n"n )°¨WÀ@`B.`B.`B.N^ _PONÐNAÿJ n p&°h f–/<Hnÿ`N¹Ä„HnÿZ/<N¹HnÿV/<ÿÈ-h&ÿü nÿÌ/(Nºç¼ nÿü ã€2;Nû8^^ˆˆˆ„`t nÿÌ"h"iJi g /(BgNºçì`R nÿÌ"h"ip°i g/(?<NºçÆ`, nÿÌ"h"ip°i g/(?<Nºç `` nÿü0(HÀ/HzðN¹Jg” nÿÌ-hÿÈ"nÿÈJQg/(N¹k`n;|ð‚ nÿÈ"hp°il&N¹-nÿZÿR nÿRCîÿ`!I"múh$nÿVLÑ?HÒ?5i$$ nÿV ¼ nÿR!nÿV1|$ B¨/.ÿZ/. N¹úü/.ÿZ/.Nºÿ``HU�/. /.NºýBJf4-n ÿR/. NºîBBnÿÐU�BgN¹Åˆ=_ÿ¸?<& nÿR/(Hnÿ°N¹}¸ nÿR/(N¹Î|=|ÿÐ=|ÿ€U�?<N¹Åˆ=_ÿhBnÿl?<*Hnÿ°Hnÿ`N¹}¸B.ÿ_J-é¨g"h0)HÀ/HmðvN¹Èb`?<HmðvN¹xU� nÿÈ/(?<N¹û`Jf?<5 nÿÈ/(N¹x`&J-é¨f nÿÌ/(N¹Z nÿÌ/(N¹k nÿÐp °h$g "n-Q nÿÐ-h `ýlN^ _PONÐ NA nJ¨f/. N¹dŒ`/. nHhÿÔN¹hvN^ _PONÐNAÿÌ n -hÿÐJ®g² n (°­úhfH/.N¹Dd-nÿN nÿN-hÿJ"nÿJX©?</(Hnÿ`N¹}¸ nÿJY¨|ÿ_`\ nÿRp*°h VÀU�/(-@ÿNN¹b¦ .ÿNÀg6=|ÿ¨Bnÿ” n h0($HÀ-@ÿª?<!HnÿˆHnÿ`N¹}¸|ÿ_J.ÿ_g2-|ÿŒBnÿ”?< HnÿˆN¹x-|ÿª?<LHnÿˆN¹xBnÿøU�BgN¹Åˆ=_ÿà/. n hLÐ?Hî?ÿÔ`;|ð2Líð&HîÿÔ nÿÐ/(N¹Dd nÿÐJ�f/(/Nºÿh`‚ nÿÐ"P-iÿü/.ÿüN¹Dd nÿü-hÿÌ nÿÌp°h fl"nÿÐ$i$jp°j f0/)/Nºÿ nÿÌJ¨"gBg"nÿü/)HnÿÔN¹}¸`$ nÿÐ"h"i$nÿÌ *"Ñ©/(/NºþÐ`ê/.ÿüN¹l$ nÿÐ"h"ip°iNºìÌ?<& n/(HnÿØN¹}¸ n/(N¹Î|=|ÿøBnÿä?<*Hnÿ`HnÿØN¹}¸?<*Hnÿ°HnÿØN¹}¸=|ÿ¨-|ÿª?<JHnÿˆHnÿ`N¹}¸-|ÿÿÿúÿŒ?< HnÿˆN¹xBg?.ÿàN¹Å?<?.ÿhN¹ÅBg?.ÿ¸N¹ÅN^ _PONÐNAÿ  n hp°hf n/( n /(/.NºÿÔ-n ÿ¤ n h S€ã€2; WÀ"h"i€)gB/(/Nºþ”/.ÿü?<NºåBg nÿü/(HnÿÔN¹}¸?< nÿÌ?(N¹Å`| nÿÌJh f/.ÿü?<NºäØ nÿÌp°h WÀ(AÂg/.ÿü?<Nºä² nÿÐ"h"i|"nÿÌ$h$j5i$h$j5i /(/NºýäN^ _PONÐNAÿÈ-n ÿÐ/. nÿÐ/Nºû nÿÐ/(N¹DdJ.+     ÿÈN¹¬(0-é��| mä°| nÜã@2;Nûšv¾R.ÐÐÐЬ@ˆd?<HnÿÈN¹x`¬?<HnÿÈN¹x`š?<HnÿÈN¹x`ˆ?< HnÿÈN¹x`v?<HnÿÈN¹x`d?< HnÿÈN¹x`R?<HnÿÈN¹x`@?< HnÿÈN¹x`.?<HnÿÈN¹x`?< HnÿÈN¹x` ;|ÿøÿþNJ` n "nþôHPHQ/<=N¹ nþôCíå!I p°nf nþôCíå ‰` nþôCíå ‰/.þôHnþÌN¹ªf?<%HnþÌN¹x|N^ _\ONÐ_NAþ°-n ÿ¸ nÿ¸-hÿ´"nÿ´p°iVÀr²iWÁ‚g<$hp°jn($h//(N¹Ä„?<5 nÿ¸/(N¹x`\ nÿ¸"h-Qÿü.ÿÿgR®ÿü=|ÿÜ-nÿüÿÞ;|rJ.g nÿÄ/(/.<N¹qÖ`P nÿÄ/(HnÿüB'N¹qÖ-nÿüÿøJ®ÿüg. nÿüJ¨g nÿü-hÿü`è nÿü"n!Q n ®ÿøN¹Ë8N^ _ÞüNÐNAÿÌ-nÿÌB®ÿü nÿÌ"hp°i ff/(/.HnÿüB'B'. /.NºúŒHnÿø/<N¹ nÿø"n!Q n ®ÿø n/B'HnÿÐN¹¬(?<HnÿÐN¹ð ?<JHnÿ¼HmïþN¹}¸ nÿ¸"h3| /(/(N¹Ëö nÿ´p°hf"h&/)"nÿ¸/)<Nºð‚`€ nÿ´/("nÿ¸/)Nºëš nÿ´p°hl;|ð‚0(HÀ/HmðvN¹ÈbNºÝˆN¹Ë8U� nÿ¸/(BgNºü²Jf" nÿ¸/(Hnÿ¼N¹ªf?<%Hnÿ¼N¹xNºÞ¶`š nÿ´0(�| m‚°|Hnzã@2;Nûg nÿÐ"h"iBi nÿÐ/(Nºã® nÿÐ-hÿÌ"nÿÌ-iÿÈ$nÿÈXª5| ?<N/)N¹x -é T€-@ÿÔB®ÿÜBnÿä?<HnÿØN¹x;|ð‚?<* nÿÌ/(HmðvN¹}¸ nÿÈY¨ .ÿÔS€/ -é �®ÿÔ?N¹Šè nÿÌ/(N¹Î|BgHnÿØN¹Çx?<+ nÿÌ/(HnÿØN¹}¸Bg?.ÿàN¹Å=|ÿøB.ÿæB®ÿúJ.g x` nÿÌ"hp°i f"/(/.HnÿüB'B'. /.NºÿP`�J. g nÿÌ/(/.N¹j2;|é�`(;|é� nÿÌ/(N¹l$ nÿÌ"h/)N¹Î|Hnÿø/<N¹ nÿø"n!Q n ®ÿø n/B'HnÿÐN¹¬(?-é�HnÿÐN¹x/.ÿüN¹‘& nÿÌ"hp°i fj/(/./.... /.NºìN¹Ë8?<%HnÿØN¹xJ.g Nºíl` B'N¹Ã˜N^ _Þü NÐNAJ®f =| `L n S€m:°¼n0ã€2;Nû$Bn `=| `=| `=| N^.ŸNuNAÿô-nÿüJ­éºf nÿüHh/<(N¹` nÿü!méº"méº+Qéº nÿü"h$mé¾"’"mé¾"¨-hÿøU�/(NºùHHnÿø/<N¹ nÿø"n!Q n ®ÿø n/B'HnÿÐN¹¬(?<HnÿÐN¹x`Ü nÿÌ"hp°i f&/(/./.... /.Nºþ`¦J. g nÿÌ/(/.N¹j2;|é�`(;|é� nÿÌ/(N¹l$ nÿÌ"h/)N¹Î|.@. A‚gFHnÿø/<N¹ nÿø"n!Q nNºÿ8 nÿø1_ B(Bh B(B¨BhB(B¨"BhCè-Iÿô"nÿôB‘3|ÿÿN^.ŸNuNAÿÄ-nÿÄB®ÿô nÿÄ"hp°i f$/(Hnÿô/.B'.. /.NºÿÄ`P nÿÄ"hp°i ft/(Hnÿô/.B'.. /.N¹ö„J.f&Hnÿð/<N¹ nÿð"n!Q n ®ÿð n/.HnÿÈN¹¬(?< ®ÿø n/B'HnÿÐN¹¬(?-é�HnÿÐN¹xN¹Ë8N^ _ÞüNÐNA n p&°h f./. n /(/.NºÿÜ/. n /(/.NºÿÈ``/. NºÙR/.N¹Dd/.NºæÒU� n /(N¹b¦Jg/. N¹dŒ` ;|ÿøÿþNJNºâbN¹Ë8HzN¹©xNºã¼N^ _Þü NÐ ASM_SAPPENDNAÿü n p&°h f./.HnÿÈN¹x`ÌJ. fvJ.g nÿÄ/(/.<N¹qÖ`P nÿÄ/(HnÿüB'N¹qÖ-nÿüÿøJ®ÿüg. nÿüJ¨g nÿü-hÿü`è nÿü"n!Q n ®ÿø`P nÿÄ/(/.N¹j2;|é�J.f&Hnÿð/<N¹ nÿð"n!Q n ®ÿð n/.HnÿÈN¹¬(0-é��| mä°| nÜã@2;Nû n /(/.NºÿÜ/. n /(/.Nºÿ`È/.B'N¹g. n h0(Áü4AíðÊÐüùªr²pfZ nCèÿØ-Iÿü"nÿüBi 3| U�BgN¹Åˆ nÿü1_?<+"n/)"nHiÿØN¹}¸ nÿü"n"i3h n h0(Áü4AíðÊÐüù¤Að-Hÿü nÿüBh!|ÿÿÿBh/. /.NºèØN^ _Þü NÐNAÿÔšv¾R.ÐÐÐЬ@ˆd?<HnÿÈN¹x`¬?<HnÿÈN¹x`š?<HnÿÈN¹x`ˆ?< HnÿÈN¹x`v?<HnÿÈN¹x`d?< HnÿÈN¹x`R?<HnÿÈN¹x`@?< HnÿÈN¹x`.?<HnÿÈN¹x`?< HnÿÈN¹x` ;|ÿøÿþNJ/.ÿôN¹‘& nÿÄ"hp°i f&/(/././. n/(/NºþÜ/. n/(/Nºþ n h0(Áü4AíðÊÐüù¤Að-HÿÔ nÿÔ1|0¼B¨N^ _PONÐNAýÄB. n (@ n (,AÂgÞ n J¨ gÒB.ÿÿ=|ÿü0.ÿü°m÷è_À.ÿÿAÀg: n h "m÷Þ0.ÿüHÀé€CñðpR@± fS@fö|ÿÿ`Rnÿü`°J.ÿÿgpAîýÌ... /.Nºý6`Z nÿÄ"hp°i fv/(/./.... /.N¹ö„J.f&Hnÿð/<N¹ nÿð"n!Q n ®ÿð n/.HnÿÈN¹¬(?<HnÿÈN¹x`ÔJ. g\ nÿÄ/(/.N¹j2;|é�J.f8J.f&Hnÿð/<N¹ nÿð"n!Q n ®ÿð n/.Hn"n "i EÑCÐÀÚSbú<ÿHPHzT-HýÈN¹ nýÈ"n "Q<ÿHPHQ-HýÄN¹ nýÄCÐAîþüÀÙSbúHnþø/<N¹-nþøþÈ nþÈ1|* B¨B¨B(Hh/< N¹ nþÈ-hþÄ"nþÄ2¼p.þü3@ /<ÿHi /<<ÿHnþü/<0) HÀ/N¹/.þøN¹Dd/.þøN¹dŒHnþô/<=N¹,     èèènn8nnnnnnnnnnnnnnnn’’nnnn’’nnnnn  nnnn\nnnnnünn666666’nnn”’’’’nn”’nn’0(HÀ/HzêN¹Jg, nÿ¸"h//(N¹Ä„?<5 nÿ¸/(N¹x`\ nÿ¸"h-Qÿü.ÿÿgR®ÿü=|ÿÜ-nÿüÿÞ;|ð N ASM_BINARY ASM_SAPPEND FS_FBLOCKIO UIO_UNITBUSYNAÿ¬p°mû WÀ n hr²hWÁ n 0( HÀ/HzÄ-Aÿ¸N¹".ÿ¸Âg:Bnÿà=| ÿôB®ÿØB.ÿâB.ÿöHnÿø/< N¹-nÿøÿ´ nÿ´0¼p-ú¤1@ p=h ÿ²°nÿ²n(=@ÿ¼0.ÿ¼ nÿ´2.ÿ¼CíÒüú¤± 0.ÿ¼R@hÒ?<NHnÿÔN¹xB®ÿÆHn?<JHnÿ¼HmïþN¹}¸ nÿ¸"h3| /(/(N¹Ëö nÿ´0(HÀ/HzBN¹Jg nÿ¸"h/)N¹dŒ` nÿ´/("nÿ¸/)Nºé–NºÛªN¹Ë8 nÿ´p(°hWÀr)²hWÁ‚p"°hWÀ€r#²hWÁ‚g:Cîþ´EúàGÑÀÚSbú$P<ÿHQHR-Iþ°N¹"nþ°HQN¹©à`ª nÿ´pQ°hWÀrJ²hWÁ‚gHzÿÂB'HnÿÔN¹¬(?<HnÿÔN¹x;|û /. /.Nºÿ n -hÿ¾N¹Ë8/. N¹MŠ n !nÿ¾B®ÿÎHnÿÊB'HnÿÔN¹¬(?<HnÿÔN¹xHnÿÂN¹‘&Bmû /. N¹Vn/. N¹kHnÿÊN¹‘&;|û N¹Ë8`j-n ÿ´ nÿ´-hÿ°"h-iÿüJmû WÀ"hr²iWÁÂg`j nÿ´"hp°iWÀr²h WÁ¦N¹©x`‚ nÿ´0(�|Eã@2;Nû.jjjjj...jjjjjj HzâN¹©x`>Aîþ´CúBEÐÀÙSbú"nÿ´$Q<ÿÿHPHR-Hþ°N¹ nþ°HPN¹©x`NºÜ`ä nÿ¸"h/Hnÿ¼N¹Ä„=|ÿÈ?<5Hnÿ¼N¹x nÿ¸"h3| "h3| ;|ð‚?<*Hmð&HmðvN¹}¸ nÿ´/("nÿ¸/)Nºè g/(N¹k`> nÿ´0( HÀ/HzN¹Jg nÿ´/(N¹l$` nÿ´/(N¹Dd nÿ´0( �|ã@2;Nû þ"´´J6’°´´ê °Ô°"hp°ifdJmû f/. N¹Vn`J=|ÿô-|ÿö?<HnÿÔHmð&N¹}¸/. nÿ´/(N¹Ë¨ nÿ´"h"i$nÿ°5i `l nÿ´"h"iNºÚN¹Ë8HzÖN¹©xNºÛx`\ nÿ¸"h/Hnÿ¼N¹Ä„BnÿÈ?<Hnÿ¼N¹x=|ÿÈ?<5Hnÿ¼N¹x nÿ¸-hÿä=|ÿÜ"h S€-@ÿÞBmð‚?<*Hnÿ¼HmðvN¹}¸;|ð‚+|ð*?<*Hmð&HmðvN¹}¸B­ð* nÿä/(N¹dŒNºÙdN¹Ë8HzHN¹©xNºÚ¾ nÿä-PÿäJ®ÿäf’ nÿ¸"h3| "h3| `| nÿ¸J)f/("h"i0) R@?NºÉ$?<2 nÿ´"h/)N¹x/. nÿ´/(N¹Ë¨ nÿ´"h"i$nÿ°5i `¸ nÿ´"hp°Qf /(N¹Z/. nÿ´/(N¹Ë¨?<Hmðž nÿ´/(N¹}¸;|é�`l nÿ´"hp°ifšJmû f/. N¹Vn`€ nÿ´/(N¹k;|ð2?<NHmð&N¹x-|ÿØ-hÿ°"nÿ°3| 3| 3|#|ÿÿÿþ|ÿB)#mû6"`@ nÿ¸"h3| "hB)/. B§Nºé”` nÿ¸"h/)?<NºÏÔ nÿ¸"h/)N¹k nÿ¸"h!Q-hÿ°"nÿ°-iÿì$Q-jÿð$Q$R-jÿô/.ÿìN¹dŒ/.ÿðBgNºÏ€/.ÿðN¹k/.ÿô?<NºÏj/.ÿôN¹kNºØ:N¹Ë8HzÞN¹©xNºÙ” nÿ¸Bnÿà?<HnÿÔN¹x-|ÿö?<HnÿÔHmð&N¹}¸/. nÿ´/(N¹Ë¨ nÿ´"h"i$nÿ°5i `º nÿ´"h"iJ)g~"h-iÿ¬/(N¹l$|ÿÓ nÿ¬p°h g"nÿ´/)0( R@?NºÇœB.ÿÓ-|ÿØBnÿà?<HnÿÔN¹x?<2 nÿ´"h/)N¹xJ.ÿÓgNºÔ^/. nÿ´/(N¹Ë¨ nÿ´"h-hÿ°"nÿ°3| |3| `X nÿ¸-hÿ°"nÿ°3| |3| =|ÿÜ-|ÿÞ;|ð ?<JHnÿ¼HmïþN¹}¸ nÿ¸-hÿä"nÿä/)N¹dŒ nÿä-Pÿä nÿä/(N¹dŒ nÿä-Pÿä nÿä/(?<NºÎ˜ nÿä/(N¹k nÿä-Pÿä nÿä/(?<NºÎr nÿä/(N¹k=|ÿÜ nÿ´p/°hf-|ÿÞ`"i$nÿ°5i ` nÿ´/(N¹Z/. nÿ´/(N¹Ë¨ nÿ´"h"i$nÿ°5i `Ì/. nÿ´/(N¹Ë¨ nÿ°Bh B(`ª/. nÿ´/(N¹Ë¨ nÿ°Bh Bh X¨B(`€ nÿ´"h"ip°i g*J-é¨g/(/-úP<úN¹\ nÿ´/(BgNºÆl/. nÿ´/(N¹Ë¨ nÿ°B(`$/. nÿ´/(B®ÿÞBmð‚?<*Hnÿ¼HmðvN¹}¸Nº×N¹Ë8HzôN¹©àNºØ^`B nÿ¸-hÿ°"nÿ°3| 3| |$h/*N¹kNºÖºN¹Ë8 nÿ´0(�|?ã@2;Nû D6(RHzN¹©x`DHzN¹©x`6Hz*N¹©x`(HzâN¹©x`HzôN¹©x` HzN¹©xNº×¬`� nÿ¸"h/)N¹dŒNºÖ$N¹N¹Ë¨ nÿ°B(=|ÿô-|ÿö?<HnÿÔ"nÿ´/)N¹}¸`â nÿ´"hp°ifŽJmû f/. N¹Vn`t nÿ´/(N¹k;|ð‚+|ð*?<*Hmð&HmðvN¹}¸?<*Hmð&HmðvN¹}¸B­ð*NºÎzN¹Ë8Hz†N¹©xNºÏÔ nÿ°1| 1| |`< nÿ´"h"iJ)g /(NºÄÞ nÿ´"hp*°i Ë8 nÿ´0(�| ã@2;Nû"Hz¤N¹©x`Hz¼N¹©x` HzÄN¹©xNº×F nÿ¸-hÿ°"nÿ°3| |3| ` ;|ÿøÿþNJN^ _PONÐ0À FS_FASM_ASM_LNASM_POSASM_SINASM_COSASM_EXPASM_HEXASM_SCANASM_SQRT ASM_SCOPY ASM_OCTAL ASM_ARCTAf/(?<<N¹Ï†`6 nÿ´"h-iÿ¬"nÿ¬p°i WÀ)AÂg/(?<NºÄö nÿ´"h"ip°i fV/(N¹k;|ð‚?<*Hmð&HmðvN¹}¸NºÍ˜N¹Ë8HzœN¹©xNºÎò nÿ°1| 1| |`Z nÿ´/(?<NºÄ| nÿ´/(N¹l$?<1 nÿ´"h/)"h/)N¹}¸/. nÿ´/(,     ÿÜN^ _PONÐNAÿþ n BPBnÿþRnÿþ0.ÿþHÀå€AíÐüöê".²°f n 0®ÿþ nÿþmÐN^ _Þü NÐG1"K"4NAÿºp°mû f@Bnÿä=| ÿøB®ÿÜB.ÿæB.ÿúHnÿü/< N¹-nÿüÿ¾ nÿ¾0¼p-ú¤1@ p=h ÿ¼°nÿ¼n(=@ÿÂ0.ÿ nÿ¾2.ÿÂCíÒüú¤± 0.ÿÂR@hÒ?<NHnÿØN¹xB®ÿÌHnÿÈk nÿÎ/(?<Nº¶2 nÿÎ/(N¹kNº¾þN¹Ë8 nÿÎp°h fHzPN¹©x` HzJN¹©xNºÀ< nÿÎ-hÿÆ"nÿÆ3| 3| |!múD` nÿÎ"h-iÿÆ"nÿÆp°i f3| |`2 nÿÆp°h WÀ"nÿÎ$i$jr²j WÁÂg /)N¹l$ nÿÎ/(N¹l$ nÿÎ/(?<NºµL nÿÎ/(B'HnÿØN¹¬(?<HnÿØN¹x;|û /.NºÿB n"h -iÿÄ/( N¹MŠ n"h #nÿÄB®ÿÔHnÿÐB'HnÿØN¹¬(?<HnÿØN¹xHnÿÈN¹‘&Bmû n/( N¹Vn n/( N¹kHnÿÐN¹‘&;|û N¹Ë8`¾Jmû f n/( N¹Vn`¤ n-h ÿ¾"nÿ¾-iÿº/)N¹k nÿ¾/(N¹kNºÅ$N¹?<Nºµ< nÿÎp°h WÀÀ-é¨"hr*²i VÁÂg4/(N¹l$=|ÿø-|ÿÿú?<HnÿØ nÿÎ"h/)N¹}¸ nÿÎ"h"i3| ?<""h/)"h/)N¹}¸ n/( "nÿÎ/)N¹Ë¨ nÿÎ-hÿÆ"nÿÆ3| |p°h f ?<K/(N¹x nÿÎ"hp*°i WÀ"hJ©]ÁÂ"hp*°i VÀ‚g`?<N¹Ë¨ nÿ°1| ` nÿ´/(N¹kNºÌüN¹Ë8 nÿ´0( �|!ã@2;Nû"HzöN¹©x`HzòN¹©x` nÿ°1| NºÎ nÿ°1| |`”Jmû f/. N¹Vn`z nÿ´/(?<NºÃ˜ nÿ´/(N¹kNºÌdN¹Ë8 nÿ´"h"ip°if/. /(N¹Ë¨` HzfN¹©x nÿ°1| Ë8 nÿ¾0( �| ã@2;Nû$2HzRN¹©x`(HzNN¹©x`HzJN¹©x` HzFN¹©xNºÆ6 nÿº1| 1| |N^.ŸNuASM_RADDASM_RSUBASM_RMULASM_RDIVNAÿÆ n-h ÿÎ"nÿÎp°i fØ/)Nº» nÿÎ"h-iÿÊ"nÿÊp°i f/(?<<N¹Ï†`, nÿÊp°h NºÍŒ nÿ°|ÿ1| `N^ _PONÐ  @`ASM_MPYASM_RMUL ASM_ROUND ASM_TRUNC ASM_FLOATNAÿø-n ÿü nÿü-hÿø/(N¹k nÿü/(N¹kNºË’N¹Ë8 nÿü0( ã@2;Nû DR(6HzdN¹©x`DHz^N¹©x`6HzXN¹©x`(HzRN¹©x`HzLN¹©x` HzFN¹WÀ(AÀg"nÿÎ/)?<Nº»$ nÿÊp°h f"nÿÎ/)N¹k nÿÎ/(Nººˆ nÿÎ"h"ip°i f/(?<<N¹Ï† nÿÎ"h"ip°i WÀ"h"ir²i WÁ‚"h"ip°i WÀ"h"i)BÄ„gæ"h-iÿÊ"nÿÊp°i g>p°i f3| |` nÿÎ/(/(?<©xNºÌˆ nÿø1| N^ _PONÐASM_EQASM_NEASM_GTASM_GEASM_LTASM_LENAÿþ n h hp°hf/. /.Nºþð`à/. HnÿþHnÿÿNºÅ?< n /(N¹Çx n hBh J.ÿþgX n 0( ã@2;Nû (D„Ä?<> n /(N¹x;|é�`?<= n /(N¹x;|é�`Nº»ò nÿÎ/(N¹k nÿÎ"h-iÿÊ"nÿÊp°i g,p°i f3| |` nÿÎ/(?<Nº¹ì nÿÎ/(N¹kNºÂ¸N¹Ë8HzN¹©xNºÄ nÿÎ-hÿÊ"nÿÊ3| 3| |`ä nÿÎ/(?<Nº¹’ nÿÎ/(/(?<Nº»0 nÿÎ"h"ip°i fH?<1"h/)"h/)N¹}¸ n/( "nþJ.ÿÿg?<D n /(N¹x;|é�`?<< n /(N¹x;| é�`¾J.ÿÿg?<F n /(N¹x;|é�`?<: n /(N¹x;| é�`~J.ÿÿg?<E n /(N¹x;|é�`?<9 n /(N¹x;| é�`>J.ÿÿg?<C n /(N¹x;|é�`?<; n /(N¹x;| é�`ÿÎ/)N¹Ë¨ nÿÎ"h/)N¹Î|`V nÿÎ/(N¹l$?<1 nÿÎ"h/)"h/)N¹}¸ n/( "nÿÎ/)N¹Ë¨ nÿÎ"h/)N¹Î| nÿÎ"h3| nÿÎ!múD`ì nÿÎ/(Nº¸2 nÿÎ"hp*°i f"h/)HnÿÒ"n/)NºúH`BnÿÒ nÿÎp°h WÀJnÿÒVÁÂg®"hS©/(N¹l$ nÿÎ/(T n 0( ã@2;Nû (D„Ä?<> n /(N¹x;|é�`?<= n /(N¹x;|é�`þJ.ÿÿg?<E n /(N¹x;|é�`?<9 n /(N¹x;| é�`¾J.ÿÿg?<C n /(N¹x;|é�`?<; n /(N¹x;| é�`~J.ÿÿg?<D n /(N¹x;|é�`?<<N¹Dd nÿÎ/("h"i?) <N¹Ï† nÿÎ/("h"i?) Nº¸?< nÿÎ"h/)"h/)N¹}¸ n/( "nÿÎ/)N¹Ë¨ nÿÎ"h"i$h5i "hR©`ê nÿÎ"h-iÿÊ"nÿÊp°i f/(?<<N¹Ï†`, nÿÊp°h WÀ(AÀg"nÿÎ/)?<Nº·T nÿÊp°h f"n n /(N¹x;| é�`>J.ÿÿg?<F n /(N¹x;|é�`?<: n /(N¹x;| é�N^ _PONÐNAÿ¨?<HnÿÔN¹ÇxHnÿü/<N¹ nÿüB¨/. HnÿüB'N¹lÄ-|ÿÎ?<0Hnÿ¬HnÿÔN¹}¸-|ÿ°Bnÿ¸?<Hnÿ¬N¹x/.ÿüN¹‘&=|ÿà?<HnÿÔN¹x n -hÿ¨ nÿ¨1| 1nÿÎ/)N¹k`L nÿÎ"hp+°i WÀ"h"ir²‘WÁÂ"hp°QWÀ€g/(?<Nº¶ø nÿÎ/(N¹k nÿÎ/(Nº¶j nÿÎ"h-iÿÊ"nÿÊp°i f/(?<<N¹Ï†`, nÿÊp°h WÀ(AÀg"nÿÎ/)?<Nº¶‚ nÿÊp°h WÀ"nÿÎ$i$jr²j WÁ‚g˜/)?<Nº¶P nÿÎ/(N¹-     N/(N¹x -é T€-@ÿÔB®ÿÜBnÿä?<HnÿØN¹xBg nÿÎ"h/)/(N¹}¸ .ÿÔS€/ -é �®ÿÔ?N¹Šè`NºÀâ nÿÎ!múH"h/)N¹Î|N^.ŸNuASM_MPYASM_DIVASM_MODNAÿÈ n-h ÿÌ"nÿÌ$iJªo´B.ÿÑ/)Nº³ nÿÌ"h"ip°i g@"hp°©n/(?<Nº³N` nÿÌ/(` nÿî/(?<<N¹Ï† nÿî"h-iÿæ"nÿæ=i ÿöiÿú`zp°nÿôfpp°nÿöWÀ.ÿúAÂp°nÿöWÀ‚g nÿî/(?<<N¹Ï†` nÿî/(?<<N¹Ï† nÿî"h-iÿæ"nÿæ=i ÿøiÿûp°nÿöWÀr²nÿøWÁ‚p°nÿöWÀ.ÿúBÄ„p°nÿøWÀ.ÿûA‚g> nÿî/(?<Nº"h"i0) R@?Nº³.`|ÿÑ nÿÌ/(N¹l$ nÿÌ"h?)"h"i?)?<"h"i?) N¹®´J.ÿÑgNº¿Þ` nÿÌ/(N¹l$ nÿÌ"h"iJ)gÎ -é T€-@ÿÒB®ÿÜBnÿä?<HnÿØN¹x-|ÿúp nÿÌ"h")D�HÀ-AÿȰ®ÿÈn=@ÿÖ .ÿúã€-@ÿú0.ÿÖHÀR€hàS®ÿú=|ÿøBgHnÿØ nÿÌ«B nÿî/(/(?<Nº¬à nÿê1| "nÿî#múD`: nÿî/(?<Nº« nÿî/(/(?<Nº¬¤ nÿê1| "nÿî#múH/. /Nºü€U� nÿî"h/)/Nºûf=_ÿüU� nÿî"h/)/NºûN=_ÿþ0.ÿüÁü 2.ÿþHÁÐ�ã€2;Nû††îœîœ6���††L†*†6���œœœœ²œ6���L†L��"h/)N¹}¸ .ÿÒS€/ -é �®ÿÒ?N¹Šè nÿÌ"h-iÿÈ"h )D€?"nÿÈ?)?<?) N¹®´`2 nÿÌ"h-iÿÈ"h )D€?"nÿÈ?)?<)?) N¹®´ n/( "nÿÌ/)N¹Ë¨ nÿÌ"h"i$h5i "hp°i f !múD` nÿÌ!múHN^.ŸNuNAÿðJ-é©g¶B®ÿøB®ÿü n"h -i�6���†††���6���L†L���6���6 nÿî/(N¹l$/. nÿî/(N¹Ë¨ nÿî0( HÀЀCúëèÒüÿè?1"h/)"h/)N¹}¸ nÿî"h/)N¹Î|Nº¶¢`¤p°nÿþf nÿî/(N¹l$ nÿîp °h f0/. /(N¹Ë¨Bg nÿî"h/)"h/)N¹}¸`T nÿîÿô"nÿô3| U�?<N¹Åˆ nÿô1_Bh n"h p°i f(/( HnÿøHnÿü<ÿB'<ÿ"h /)NºÎô`( n/( HnÿøHnÿü<ÿB'<ÿ"h /)NºÔ/.ÿøN¹‘&/.ÿüN¹‘&N¹Ë8`B n-h ÿô"nÿô-iÿð$i&i0+ °j m/)Nº° nÿô/(Nº¯ô` nÿô/(Nº¯ä nÿô/(Nº¯Ø nÿô"hp °h fF"nÿê;i ð2/. /(N¹Ë¨?<G nÿî"h/)Hmð&N¹}¸ nÿî"h/)N¹Î|Nºµô`ö/. nÿî/(N¹Ë¨Jnÿüg4 nÿî0( HÀЀCúêØÒüÿè?1"h/)"h/)N¹}¸`6 nÿê;h ð2"nÿî0) HÀЀEúêœÔüÿè?2$i/*Hmð&N¹}¸ nÿî"h/)N¹Î|NºµZ`\/. nÿî/(N¹"ip°i fd"h"iBi "n/) /(N¹Ë¨ nÿô0( HÀЀCúòÒüÿè?1"h/)"h/)N¹}¸ nÿô"h/)N¹Î|`r nÿô/(N¹l$ nÿô"h"iBi "n/) /(N¹Ë¨ nÿô0( HÀЀCúñ¨Òüÿè?1"h/)"h/)N¹}¸ nÿô"h/)N¹Î|N^.ŸNuNAÿü-n ÿü nÿü0( S@ã@2;˨`F nÿîp °h fp/. /(N¹Ë¨Jnÿþf( nÿê;h ð2Bg"nÿî$i/*Hmð&N¹}¸`Bg nÿî"h/)"h/)N¹}¸ nÿî"h/)N¹Î|`\ nÿîp °h fN/(N¹l$/. nÿî/(N¹Ë¨?<G nÿî"h/)"h/)N¹}¸ nÿî"h/)N¹Î|Nº´f`h nÿî/(N¹l$/. nÿî/(N¹Nû0¢¢¢¢&¢¢&¢&&&:Bn`~=|`t=|`j nÿüJ¨"f =|`P nÿüp°¨"_Àr²¨"\ÁÂg =|`, nÿüp€°¨"_Àr²¨"\ÁÂg =|`=|`N^ _PONÐNAÿü-n ÿü nÿüp°h WÀrø²¨"_ÁÂpÿ°¨"\ÀÀ@N^ _PONÐNAÿô-n ÿøU� nÿø"h˨ nÿî0( HÀЀCúéDÒüÿè?1"h/)"h/)N¹}¸ nÿî"h/)N¹Î|Nº³þ nÿîp °h f?<2/(N¹xNº³Þ`à nÿî/(N¹l$/. nÿî/(N¹Ë¨ nÿî0( HÀЀCúè¼Òüÿè?1"h/)"h/)N¹}¸ nÿî"h/)N¹Î|Nº³v`x nÿîp °h fTp°nÿþf /(N¹l$Jnÿþg?</)/Nºÿ¨Jg< nÿø"h-iÿô"nÿô )"D€#@"p °h f 1| ` nÿø1| nÿøp °h fLU�"h/)/NºÿJJg6 nÿø"h-iÿô"nÿô )"D€#@"1| -hÿü!h!nÿüN^ _PONÐNAÿæ-n ÿî nÿî-hÿê (°­úLf /Nºï–`t nÿî0( HÀ/HzlN¹Jg /Nºñ¨`N n2 nÿî"h/)N¹x` nÿê;h ð2?<2Hmð&N¹xNº³/. nÿî/(N¹Ë¨`N^ _PONЀ0NAÿø-nÿü nÿüY�/(/<-HÿøN¹ÏT nÿø ã€Ñ¨ (€!@p°¨WÀr²hWÁÂg R¨B¨ nÿüJ¨WÀrÿ²hWÁÂ0(l^@æ@HÀ°® WÀÀgB(N^ _Þü NÐNAÿô-nÿîp°h f /NºùŒ`6 nÿî0( HÀ/Hz4N¹Jg /Nºûª` nÿî"h$h0°Qo/(Nº¬x nÿî/(Nº¬l` nÿî/(Nº¬\ nÿî/(Nº¬P nÿî"h-iÿæ"nÿæ=i ÿò=i ÿöiÿú"h-iÿæ"nÿæ=i ÿô=i ÿøiÿûp°nÿòfpp°nÿøWÀ.ÿûAÂp°nÿøWÀ‚g/(?<<N¹Ï†ÿü nÿü-hÿø-n ÿô/.N¹Dd nÿôJ¨VÀ€(g–"n"ip°i f/.B'N¹g././.N¹Ë¨ nÿü/(/(N¹Ëö nÿø"nÿô )ѨJ)g<|$i 1j$i j 0) HÀѨ$nÿü/*&i //.Nºþ¤`&/./.N¹Ë¨ nÿô/( "nÿü/)N¹ËöN^ _ÞüNÐNAÿ$ n-h ÿ(-      n"hÿüJ)g¤"nÿ($i$jp°j g /)N¹l$ n"h -iÿ$"nÿ$|ÿ$nÿ(&j&k3kB©3|&hÿü3k &hÿü&kk &hÿøJ+g |&hÿø3k&hÿø3k` nÿ$B(`Ô n"hÿøJ)gt=|ÿø"hÿø=iÿà=|ÿäBg"nÿ($i/*HnÿØN¹}¸ nÿ("h/)N¹"nÿø1i` nÿ�B( nÿü0( HÀ/ nÿ�?(Hh/Nºùb nÿ�0(HÀ//.ÿì-HÿŒN¹ nÿŒ ‘¨`|-nÿüÿŒ nÿŒJ(g$0( l^@æ@HÀ-@ÿè"h$nÿ”&ji /.ÿè nÿ�?(Hh/Nºøð nÿøJ(g´=|ÿ¸ nÿø=hÿ  nÿø=hÿ¤=|ÿà nÿ�=hÿÈ=hÿÌ"nÿø0)°hl =|ÿ¤?<#Hnÿ˜Î| nÿ("h"i-Qÿ,"h"iLî?ÿØHÑ? nÿ("h"i"®ÿ, nÿ("h"ip°i g /(N¹l$ n"h -iÿ$"nÿ($i$j&nÿ$7j7||N^.ŸNuASM_MPYNAÿ®/.Hnÿþ n/(NºÞd=|ÿÎ=nÿ¶ n =PÿºJnÿþgv n p°Pf=|ÿº?<#Hnÿ®N¹xp°nÿþfBgHnÿ®Hnÿ®N¹N¹x nÿø1| nÿø"nÿ�0)°hl =|ÿÌ?<#HnÿÀN¹x nÿ�1|BgHnÿ˜HnÿÀN¹}¸?< nÿø?(N¹Å nÿ�/.ÿè/.ÿì-HÿŒN¹ nÿŒ ‘¨-nÿüÿŒ"nÿŒ$i °®ÿèVÀÀ)g6p°®ÿèf Bh `$p°®ÿèf nÿ�1| ` nÿ�1| N^ _PONÐNAÿ¬-n ÿ¸ nÿ¸-hÿ´"h/HnÿÔN¹"hÿøp°i f"nÿ(/)B'N¹g. n/( "nÿ(/)N¹Ë¨ nÿ(/(/(N¹Ëö nÿ(/(Nº£~ nÿ(/(N¹Z nÿ("h"iJi f/(?<Nº£Ä nÿ("h"ip°i WÀ"h"i)AÂg/(?<Nº£Š nÿ(/(N¹l$=|ÿXU� n"hÿü"i"Q0)HÀ/N¹É¸=_ÿ@ n"hÿü"i"Q-i}¸`?.ÿþ?.?<?<N¹®´ n p°Pf Nº©` n 0¼`òp°®gè=|ÿö-nÿøp°nÿºWÀ ®ÿ^ÁÂg=|ÿº?<#Hnÿ®N¹x n 0¼p°nÿºf ?<1HnÿÖHnÿ®N¹}¸ n 0¼`€;|ð‚?<*Hnÿ®HmðvN¹}¸?<*HnÿÖHmðvN¹}¸0.ÿ¶Áü4AíðÊÐüûDBpNº¤2N¹Ë8Hz>N¹©xÿ?<* nÿÔ/(HnÿØN¹}¸ nÿÔ"h3| "h3| "h3nÿàN^.ŸNuNAÿØ/.N¹ÒÎ=| ÿøB®ÿÜB®ÿú|ÿÿú n h0(HÀå€"<\El’€-Aÿü;|ð‚?<*HnÿØHmðvN¹}¸Y®ÿü?<*HnÿØHmðvN¹}¸ n/(N¹Î| n h1| N^NºöÖ`N^.ŸNuNuNAÿÔ-nÿÔ nÿÔ (°­úTf>p°PWÀ"hr²i VÁÂg&Bnÿä=|ÿø-|ÿú?<HnÿØ/(N¹}¸N^.ŸNuNAÿìB. n p°h\À". ²­úDVÁ np*°h VÀÀgn/.N¹Dd n-hÿô n-hÿð/. HméÂHméÆN¹jÐ-nÿðÿì nÿìJ(gNp°hWÀ(AÂg-|ÿÿÿ.ŸNuNAÿ°/.N¹ÒÎ/<HnÿØN¹Ä„=|ÿä=| ÿÐB®ÿ´B®ÿÒ|ÿÿÒ n h0(R@HÀå€"<\El’€-AÿÔ?<*Hnÿ°HnÿØN¹}¸X®ÿÔX®ÿÜ?<*Hnÿ°HnÿØN¹}¸Y®ÿÜ?<5HnÿØN¹x n/(N¹Î|N^.ŸNuNAÿØ/. N¹ÒÎ=| ÿøB®ÿÜB®ÿú|ÿÿú n h0(HÀå€"<\El’€Y�-Aÿü n1| ?<*Hnÿü`( nÿìp(2(’@HÁå�CíÒüöê 1S€-@ÿü`f nÿì0( ã@2;Nû&JJ(g-|ÿü` -|ÿÿü`. nÿìJ(g-|ÿÿü` -|ÿÿÿü` -|ÿÿÿÿü nÿìJ(g .ÿüD€S€-@ÿø`B®ÿø np°h WÀ nr²h WÁ‚ n (°® WÀÀÀ.g B.`" .ÿø°­éÂ]À".ÿü²­éÆÿØ/.N¹}¸X®ÿü nX¨?<*HnÿØ/.N¹}¸ nY¨ n1| n /(N¹Î|N^ _PONÐNAÿÐ;|êJmê^À2-êÃü4AíðÊÐüüät´pVÁÂgSmê`ÖJmêoH;|éì;|éØ=|ÿÿÿþRnÿþ=|ÿÿÿüRnÿü0.ÿþHÀЀ2.ÿü4èBãJAHÂЂAíêÐüÿètDÒ<ÿãªF‚Űtv㫇° nÿüm¶ nÿþm¤p^Á‚g|N^ _Þü NÐNAÿ¦U�/./. .NºþBJg¤/-ÿö/Hz<+Oÿö/.NºýÈ/.N¹l$ -éÆ�­éÂNvl ;|ÿþNJ -éÆ�­éÂNv €ÿo ;|ÿþNJ-nÿª nÿª-hÿ¦=|ÿÐ=|ÿ¼"nÿ¦p°i f ;|ÿþNJ nÿ¦Jh f/.?<N¹ÓBJ­éÂf nÿª"h=iÿ¸`FU�?<N¹Åˆ=_ÿ¸?</     /<-Hÿ€N¹ÏT nÿ€ ã€Ñ¨ (€!@pÿ°hg‚=|ÿÐ=hÿ¸=hÿ¼J¨g&=|ÿ¨-hÿªBgHnÿˆHnÿ°N¹}¸ nÿ„B¨=|ÿ¨U�?<N¹Åˆ=_ÿ� nÿ„=hÿ”?<*Hnÿ°HnÿˆN¹}¸=|ÿø-|ÿú?<HnÿØHnÿˆN¹}¸-|ÿú?<(HnÿØHnÿˆN¹}¸-|ÿú?<HnÿØHnÿ°N¹}¸ nÿ„J(ÿ¬/(N¹Î|` nÿ¨p°h g ;|ÿøÿþNJN^.ŸNuNAÿÎ/. N¹Dd-n ÿÒ nÿÒ-hÿÎ"nÿÎp°i f$BgHnÿØN¹Çx?<+HmðNHnÿØN¹}¸`Ò nÿÎ0( HÀ/Hmé’N¹ nÿÎp°h WÀ€gžU�/. N¹Ë\Jg nÿÎ=hÿà`zJ.f /. N¹Ì> nÿÒ/(N¹Î|BgHnÿØN¹Çx nÿÎ=h ÿÖJh fgœ0(°hl*=hÿà=|ÿä?<#HnÿØN¹x nÿ„1|`0 nÿ„0(°hl =|ÿ”?<#HnÿˆN¹x nÿ„1|=|ÿø nÿ„=hÿà=hÿäBgHnÿˆHnÿØN¹}¸?<?.ÿ�N¹Å` nÿ„|ÿ1nÿ�1hN^.ŸNuNAÿ¦ n-hÿª nÿªpÿ°hf´p°hf˜p°¨nR¨Q¨/.N¹Ì>?<&"nÿÒ/)HnÿØN¹}¸`?<+ nÿÒ/(HnÿØN¹}¸ nÿÎ1nÿÖ `;|ÿøÿþNJBnÿà nÿÎ1| 1nÿàBh B(B¨B¨"N^ _\ONÐNAÿÐ n1| /. N¹Dd-n ÿÔ nÿÔ-hÿÐ nÿÐp°h fzJh f@/. B'NºþrBnÿø nÿÐ=hÿà?<*HnÿØ/.N¹}¸Bg nÿÐ?(N¹Å`0/. N¹Ì>?<*=|ÿÐ nÿªp�¨-@ÿÒ?<Hnÿ°"n/)N¹}¸ n/(N¹Î|=|ÿøU�?<N¹Åˆ=_ÿàBnÿä?<=HnÿØN¹x?<2HnÿØN¹x nÿªBh ` nÿªp°hWÀ/(Hzú-@ÿ¦N¹ .ÿ¦À-ðÆA nÿª‚(Âg*p°¨fR¨ nÿªB(Bh /.N¹Ì>`® nÿªp°hWÀJ¨WÁÂ-ðÆ@€(Àg nÿÔ/(/.N¹}¸ n /(N¹Î|` nÿÐp°h f.?<*"nÿÔ/)/.N¹}¸?< nÿÐ?(N¹Å`Ì nÿÐp°h f?<*"nÿÔ/)/.N¹}¸`¤ nÿÐp °h WÀr²h&WÁÂp°h WÀ€(‚Jh WÀÂp °h WÀ€g/. B'Nºýf`þÒ`X nÿÐp°h f4/. N¹Ì>?<* nÿÔ/(/.N¹}¸B(1| `z=|ÿøU�?<N¹Åˆ=_ÿà nÿª (€2(HÁÐ�r²€\À(AÂg* (l^€æ€Ñ¨ (€rÐ�!@Bnÿä`< nÿª0(HÀШr²€\À(AÂg¨=|ÿä`=|ÿä?<* n/(HnÿØN¹}¸ n/(N¹Î| nÿªJ(g:?(?.ÿà?<(?<N¹®´ nÿªp �h nÿÔ/(N¹Î|`?<. nÿÔ/(/.N¹}¸N^ _PONÐNAÿü/. N¹ÒÎ-n ÿü nÿü"hp°i f/. /.N¹S°`– nÿü"hp°i WÀ"(²­úLWÁÂgR"n3| ?<*/(/.N¹}¸ nX¨?<* nÿü/(/.N¹}¸ nY¨ n1| `?<* nÿü/(/.N¹}¸ nÿü/(N¹Î|N^??.ÿà?<?<N¹®´`f nÿª0(HÀШr ’€??.ÿà?<)?<N¹®´Bg nÿªp �h??< Hnÿ°N¹°F=|ÿä?<Hnÿ°HnÿØN¹}¸ nÿª|ÿ nÿª1| `Î=|ÿøU�?<N¹Åˆ=_ÿà=|ÿä?<* n/(HnÿØN¹}¸ n/(N¹Î|=|ÿÐ nÿª=hÿ¸?<(Hnÿ°HnÿØN¹}¸?< nÿª?(N¹Å _PONÐNAÿö/.N¹ÒÎ-nÿú nÿú-hÿö"nÿöp°i f/.N¹Rv`Ü nÿöp°h gÎ"nÿú$ip°’fR;|ð‚X¨=|ÿÿÿþRnÿþ nÿö0.ÿþHÀ們¨/.N¹Ì>?<* nÿú/(HmðvN¹}¸ nÿþmÄ`V nÿú"hJ‘gH"nÿö;i ð‚p°i WÀJ©"WÁÂg?<HmðvN¹x`?<* nÿú/(HmðvN¹ nÿªJ(g p �h??.ÿà?<?<N¹®´` nÿªp �h??.ÿà?<)?<N¹®´ nÿª|ÿ1| nÿªJ(g1| 1nÿàBh B(B¨B(N^.ŸNu€€NAÿ¤/.N¹Dd-nÿ¬ nÿ¬-hÿ¨"nÿ¨J)g&Y�/)/<-Iÿ¤N¹ÏT"nÿ¤ Ñ©pÿ°igô=|ÿÐ-|ÿÒ=|ÿø nÿ¬$h=j}¸ nÿú/(N¹Î| nÿö1| N^.ŸNuNAÿÐ/.N¹ÒÎ-nÿÔ nÿÔ-hÿÐ"hp°if/.N¹Q˜`` nÿÐp°h gR"nÿÔ/)N¹Î|?<HnÿØN¹Çx nÿÐ=h ÿä?<*"nÿÔ/)HnÿØN¹}¸ nÿÐ1| 1nÿàB(N^.ŸNuNAÿd-nÿh nÿh"h"iJ‘fL0( ã@2;Nû   "n B‘ÿà$h=jÿä?<)Hnÿ°HnÿØN¹}¸ nÿ¨J(g”=|ÿÐ"nÿ¬$i=jÿ¸$i=jÿ¼0(°hl$=|ÿ¼?<#Hnÿ°N¹x nÿ¨1|`& nÿ¨0(°hl=|ÿä?<#HnÿØN¹xBgHnÿØHnÿ°N¹}¸?<?.ÿàN¹Å` nÿ¨|ÿ1nÿà1h nÿ¨B( nÿ¨p°h f/.N¹S`2 nÿ¨p°h `$ n /.HnÿlN¹¬(?<HnÿlN¹x`¢ nÿh/(B'Nºùø nÿh/(B'Nºùê?<Hnÿ”N¹Çx nÿh"h"iJ)"gÈJh VÀr²h VÁÂgZ?<Hnÿ¼N¹Çx?<0HmðžHnÿ¼N¹}¸BnÿÈ nÿh"h"i3| ?<*"h/)Hnÿ¼N¹}¸=|ÿ ?<*Hnÿ¼Hnÿ”N¹}¸?<KHnÿ”N¹x?<*Hnÿ¼Hnÿ”N¹}¸WÀr²h VÁÂ0( HÀ/Hmé’-Aÿ¤N¹".ÿ¤‚g\/.N¹Ì> nÿ¨Jh f?<5"nÿ¬/)N¹x`;|ð‚?<* nÿ¬/(HmðvN¹}¸ nÿ¬/(N¹Î|`¢ nÿ¨p°h WÀ"nÿ¬")²­úLWÁÂgl/<Hnÿ°N¹Ä„=|ÿ¼?<* nÿ¬/(Hnÿ°N¹}¸X®ÿ´?<* nÿ¬/(Hnÿ°N¹}¸Y®ÿ´?<5Hnÿ°N¹x nBnÿ  nÿh"h"i3| ?<*"h/)Hnÿ¼N¹}¸?<Hnÿ¼Hnÿ”N¹}¸B®ÿðHnÿìB'HnÿlN¹¬(?< HnÿlN¹x nÿh"h-iÿd"nÿd3| #|ÿÿÿÿB©"?<*Hnÿ¼Hnÿ”N¹}¸HnÿìN¹‘&?<NHnÿ”N¹xB®ÿøHnÿôB'HnÿlN¹¬(?<HnÿlN¹x`X?<0HmðžHnÿ”N¹}¸Bnÿ ?<* nÿh"h/)Hnÿ”N¹/     rJ-é©gÄB®ÿÐJ.f n B� nÿÈp°h f$/.HnÿÐ/. <.B'B§N¹ñJ`n/.HnÿÐ/. <.B'B§N¹ö„J.f&HnÿÌ/<N¹ nÿÌ"n !Q n ®ÿÌ n /.HnÿÔN¹¬(?<HnÿÔN¹x/.ÿÐN¹‘&N¹Ë8`D/.N¹Dd?< nÿÈ"h?)N¹Å n /.HnÿÔN¹¬(ÿ|0(HÀШr ’€?"n"i?)?<(?<N¹®´ nÿ|J¨VÀÀ(g¬0.ÿ„ã@2;Nû0`"n"iBi Bgp�¨D€??<Hnÿ°N¹°F`X n h1| Bg nÿ|p�¨D€??<Hnÿ°N¹°F`( n h1| Bg nÿ|?(?< Hnÿ°N¹°F?<Hnÿ° n/(N¹}¸0.ÿ„ã@2;Nû nÿ|?<HnÿÔN¹x`b nÿÈ/(N¹Dd nÿÈ"h"ip°i VÀ€-é©g\/(N¹ÒÎ nÿÈ"h"ip °i f&=|ÿôB®ÿö?<!HnÿÔ"h/)N¹}¸`?<N nÿÈ"h/)N¹x nÿÈ"h/)N¹Î| n /.HnÿÔN¹¬(?<HnÿÔN¹x`¦ nÿÈ/(N¹ÒÎ nÿÈ"h-iÿÄ"nÿÄ0) HÀ/Hmé’N¹Bh ` nÿ|1| ` nÿ|1| ?<4 n/( nÿ€/(N¹}¸?< n h?(N¹Å n /(N¹Î|`â/.NºÛª=|ÿÐU�?<N¹Åˆ=_ÿ¸=|ÿ¼Bg nÿ|p �h??< HnÿˆN¹°F?<*HnÿˆHnÿ°N¹}¸=|ÿ¨ nÿ|=hÿ�Bnÿ”?<2HnÿˆN¹x=|ÿø nÿ|p �hHÀ-@ÿúBgHnÿØHnÿˆN¹}¸?<(}¸=|ÿŒ-|ÿŽ=|ÿ ?<HnÿlHnÿ”N¹}¸`0=|ÿ =|ÿŒ nÿh"h"i-QÿŽ?<*HnÿlHnÿ”N¹}¸-mé ÿü nÿh"h"i3| "h-iÿd"nÿd3| Bi ?< "h/)"h/)N¹}¸B®ÿè nÿhJh f"n /.HnÿlN¹¬(`HnÿäB'HnÿlN¹¬(?<HnÿlN¹x=|ÿŒ-|ÿŽ?<JHnJf nÿÈ/(Nºõ`@ nÿÄ0( ã@2;Nû ` nÿÄR¨` nÿÄV¨ nÿÈ/(N¹Ì>?<Hmðž nÿÈ"h/)N¹}¸ nÿÈ"h/)N¹Î| n /.HnÿÔN¹¬(?<HnÿÔN¹x`Î/.N¹ÒÎ nÿÈ"hp °i f"=|ÿôB®ÿö?<!HnÿÔ/(N¹}¸`?<N nÿÈ/(N¹x nÿÈ/(N¹ÿlHnÿ”N¹}¸Hnÿü<ÿHnÿlN¹¬(?<HnÿlN¹x nÿhp°h f("n /.HnÿlN¹¬(?<HnÿlN¹x`Z nÿh"h"iJ)"gFJh g>HnÿôN¹‘&?<KHnÿ”N¹xBnÿ ?<Hnÿ¼Hnÿ”N¹}¸?<?.ÿÄN¹Å nÿhJh g HnÿäN¹‘& nÿhJh VÀr²h VÁÂg"n /.HnÿlN¹¬( nÿh0(Î| n /.HnÿÔN¹¬(?<HnÿÔN¹x`L nJ¨f( n /.HnÿÔN¹¬(?<HnÿÔN¹x`J.f n P ¼ÿÿÿÿ`N^ _Þü NÐNAÿt-n ÿ€ nÿ€-hÿ|/.N¹ÒÎ nÿ|p°hm Bnÿ†` nÿ|p°hm =|ÿ†`=|ÿ† n h0( °nÿ†l/.?.ÿ†N¹ÓB/. Nºåò nÿ|p ã@2;Nû "4F`F?< HnÿlN¹x`4?< HnÿlN¹x`"?< HnÿlN¹x`?< HnÿlN¹xBg nÿh"h"i?)N¹ÅBg nÿh"h"i?)N¹Å nÿh"h"i?)N¹Êæ nÿh"h"i?)N¹Êæ?<?.ÿœN¹ÅN^ _Þü NÐNAÿÄJ.f/. /<N¹ n PB¨-n°h f/. B'Nºî` /. N¹Ì> nÿ|pÿ°hf6p°hWÀ"nr*²i WÁÂgvp°¨n R¨Q¨=|ÿ¨ nÿ|p�¨-@ÿª"nJ©f?<Hnÿˆ"n /)N¹}¸`?<Hnÿˆ n /(N¹}¸ nÿ€/(N¹Î|`¤ nÿ|p°hWÀ/(Hz|-@ÿxN¹ .ÿxÀgª n hp°h f /.Nºò( nÿÈ nÿÈ0( ã@2;NûXXXXXXXXX^^^^^^^^^îî^þ^’^^^º^’^^^^^^’’^^’’’"h"i=iÿþp°nÿþWÀr²nÿþWÁ‚gD/.N¹Dd?<N n/(N¹x n /.HnÿÔN¹¬(?<HnÿÔN¹x`.p°nÿþf/./. .NºùÚ`/.HnÿüHnÿýN¹ÿ|p°¨fR¨ n-hÿt nÿt0( ã@2;Nû ` nÿtR¨` nÿtV¨ nÿ|Bh ?<*"n/)"nÿ€/)N¹}¸ n/(N¹Î| nÿ€/(N¹Î|`Ô nÿ|p°hWÀJ¨WÁÂg "n"ip°i f /.Nºñh n-hÿt nÿt0( ã@2;Nû/.?<N¹ÓB`` nÿtT¨ nÖ’ n /.HnÿÔN¹¬(J.ÿügô nÿÈ0( ã@2;Nû 0\ˆ´?<HnÿÔN¹x`À?<HnÿÔN¹x`®J.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`‚J.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`VJ.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`*J.ÿýg?<HnÿÔN¹x`?<ÿ|1| ?<*"n/)"nÿ€/)N¹}¸ n/(N¹Î| nÿ€/(N¹Î|` nÿ|p°hfv/.NºÞ¼ nÿ|p°¨n R¨Q¨=|ÿ¨ nÿ|p�¨-@ÿª?<Hnÿˆ"n /)N¹}¸ nÿ| (l^€æ€Ñ¨ (€rÐ�!@Bnÿ„`& nÿ| (€2(HÁÐ�r²€md (l^€æ€Ñ¨ (€rÐ�!@ HnÿÔN¹x`ð nÿÈ0( ã@2;Nû 0\ˆ´?<HnÿÔN¹x`À?<HnÿÔN¹x`®J.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`‚J.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`VJ.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`*J.ÿýg?<HnÿÔN¹x`?< HnÿÔN¹x`p�¨D€??(?<Hnÿ°N¹°F nÿ|Bh ?<Hnÿ°"nÿ€/)N¹}¸Bnÿ„`¦ nÿ|0(HÀШr²€mP¨p�¨D€??(?<Hnÿ°N¹°F nÿ|1| ?<Hnÿ°"nÿ€/)N¹}¸=|ÿ„`B nÿ|?(?(?< Hnÿ°N¹°F nÿ|1| ?<Hnÿ°"nÿ€/)N¹}¸=|ÿ„/.Nºï6/.?.ÿ„N¹ÓB n0     HnÿˆHnÿ°N¹}¸ nÿ|J(g0=|ÿøU�?<N¹Åˆ=_ÿà=|ÿä?<*Hnÿ°HnÿØN¹}¸?<3Hnÿ°N¹x n h1| ?<Hnÿ° n /(N¹}¸?<?.ÿ¸N¹Å/.Nºì–/.?<N¹ÓB n h1| ?<(Hnÿˆ n/(N¹}¸?< nÿ|?(N¹Å nÿ|J(g&?<HnÿØ"n/)N¹}¸?<?.ÿàN¹4Hnÿ¢ nÿž/(N¹}¸?<?.ÿªN¹Å nÿž/(N¹Î|N^ _PONЀ€NuNAÿª np°h g nB¨ nB¨" nB( np°h g nB¨ nB¨" nB(p°® o˜J® oŒ . S€mþ°¼nôã€2;Nû0°°°:ð:ð:ð:ððððððððððððð-nÿª nÿªp°h Å?<4 n/( n /(N¹}¸?< n h?(N¹Å n /(N¹Î|N^ _PONЀ€NAÿŽ n hpÿ°hVÀ n hrÿ²hVÁ‚g/. /.Nº÷ú`¨-n ÿž nÿž-hÿš/. NºÞJ nÿšp°hWÀ/(Hz„-@ÿ–N¹ .ÿ–Àg/. /.Nº÷ª`X nÿšp°hWÀr²¨WÁÂg/. /.Nº÷€g1| B¨B(B¨"-nÿª nÿªp°h gB¨B(1| B¨" n1| ?<*/./.N¹}¸B® nT¨ nT¨`ºp°® fN-nÿª nÿªp°h g1| B¨B(B¨"-nÿª nÿªp°h gB¨1| B(B¨" n1| ?<*/./.N¹}¸U® nX¨ nX¨`0?..`. nÿšp°h f/. B'Nºæ` /. N¹Ì> nÿš (€2(HÁÐ�r²€m* (l^€æ€Ñ¨ (€rÐ�!@Bnÿô`0 nÿš0(HÀШr²€m¨=|ÿô`=|ÿô/.NºÝF-nÿ’ nÿ’-hÿŽ"nÿŽp°i f/.B'Nºåb` /.N¹Ì> n h"nÿŽ0)°h]ÀÀ)@ÿó=| Hnÿ®N¹­-nÿª nÿªp°h g1| B¨B(B¨"-nÿª nÿªp°h g1| B¨B(B¨" nÿª1| =|ÿº?<//.Hnÿ®N¹}¸?</Hnÿ®/.N¹}¸ n . ã€Ñ¨ n . ã€Ñ¨B® `zp°® ]À. AÀg =| ÿþ` . lR€â€=@ÿþ0.ÿþHÀ】® J® fN-nÿª nÿªp°hÿÂU�?<N¹Åˆ=_ÿª nÿŽ (€2(HÁÐ�r²€\ÀJnÿôWÁ.ÿóB‚Âg* (l^€æ€Ñ¨ (€rÐ�!@Bnÿ®`F nÿŽ0(HÀШr²€\Àr²nÿô\Á.ÿóB‚Âg¨=|ÿ®`=|ÿ®?<* nÿ’/(Hnÿ¢N¹}¸ nÿ’/(N¹Î| nÿš1nÿô 0.ÿôã@2;NûFŠp°hg4p g1| B¨B(B¨"-nÿª nÿªp°h g1| B¨B(B¨" n1| =|ÿº?.ÿþ. Hnÿ®N¹­?<//.Hnÿ®N¹}¸?</Hnÿ®/.N¹}¸ n0.ÿþHÀå€Ñ¨ n0.ÿþHÀå€Ñ¨`‚p. r Ò@=Aÿþ0.ÿþHÀ】® ?.ÿþ. Hnÿ®N¹­=|ÿº?<//.Hnÿ®N¹}¸ n1| ?</Hnÿ®/.�¨D€??(?<HnÿÊN¹°F?<HnÿÊ nÿž/(N¹}¸`v nÿšp°hg4p�¨D€??(?<HnÿÊN¹°F?<HnÿÊ nÿž/(N¹}¸`2 nÿš?(?(?< HnÿÊN¹°F?<HnÿÊ nÿž/(N¹}¸ nÿš0(HÀШ"n"i$n$j2)HÁÒª’€=Aÿø"n"i0)°h]À"n"iÀ)g"n-iN¹}¸ n0.ÿþHÀå€Ñ¨ n0.ÿþHÀå€Ñ¨`üp`ŽN¹Ë8 n1| n1| ?<5/.N¹x?<5/.N¹x;|ð‚=|ÿö . ã€-@ÿøJ.gR®ÿø?<*HnÿÖHmðvN¹}¸Hz*N¹©x n .ÿøÑ¨ n .ÿøÑ¨N^ _ÞüNÐ ASM_MOVELNAÿÔ nJ¨gÆ-hÿÔ"nÿÔp°i$oRB®ÿú0)$ã@ÿ’0.ÿôã@2;Nû."nÿ’p�©D€=@ÿø` nÿ’p�¨D€=@ÿø` nÿ’=hÿøJnÿølPnÿø`òp Ðnÿø nÿ’HÀ�¨=@ÿþp°nÿþm Bnÿö`p°nÿþm =|ÿö`=|ÿö?.ÿø?.ÿª?<(?.ÿöN¹®´ nÿ’0(HÀШ2.ÿøHÁ’€"n "iÒ©"n "i0)HÀÒ€=Aÿø?.ÿø?.ÿª?<?.ÿöN¹®´ nÿ’0.ÿø2;Nû=| ÿø`=| ÿø`=|ÿø n"hL© &H® ÿú-n ÿÜ`@=|ÿø nÿÔ . Ш-@ÿÜB.ÿæp°hf=|ÿà-m÷Ìÿú` =|ÿàB®ÿú=|ÿä?.HnÿØN¹xHnÿØN¹Î|`¼J® f n/(N¹dŒ`� ®ÿ o8 n/(N¹dŒ=|ÿø-n ÿú;|ð2?<HnÿØHmð&N¹}¸`Ñh`FJnÿøo?.ÿø?.ÿª?<(?.ÿôN¹®´`$Jnÿøl0.ÿøD@??.ÿª?<)?.ÿ®N¹®´ n h"nÿš0)°ho, n h=hÿú n h0.ÿøHÀ"(’€=Aÿü`| n h"nÿš0)°hl=iÿú=iÿü`T nÿšp°hWÀJnÿôWÁÂg Bnÿú`4 nÿšp°hWÀr²nÿôWÁÂg Bnÿú` nÿš=hN n/(B'N¹g. n"h-iÿÔ"nÿÔ3| #n B)?<5$h/*N¹x nÿÔB¨ n"h/)N¹Î|N^ _Þü NÐNAÿhJ®g„-nÿl/< nÿlHh N¹Jgd nÿl0(Q@mN°|nFã@2;NûL:hJ-é¥g4?<N .X€//Nºýú -é T€-@ÿpB®ÿxBnÿ€?<HnÿtN¹x;|ð‚ÿú=hÿüJnÿúg„0.ÿôã@2;Nû&Fp�nÿüD@??.ÿú?<HnÿÊN¹±`8p�nÿüD@??.ÿú?<HnÿÊN¹±`?.ÿü?.ÿú?< HnÿÊN¹±=nÿôÿ®?<HnÿÊHnÿ¢N¹}¸ nÿš1nÿô JnÿôWÀr²hWÁÂg?<*Hnÿ¢"nÿž/)N¹}¸`Lp°nÿôWÀ nÿšr²hWÁÂg?<*Hnÿ¢"nÿž/)N¹}¸`?<?<5/./NºýÆJn fÔ nÿlJ¨f4?<HmðvN¹x=|ÿ¼-|ÿÿÿÿÿ¾?<*HnÿœHmðvN¹}¸`ˆ?<5 .м–//Nºýj nÿl"hp°‘f>=|ÿ¼ .°­údf-|ÿÿÿýÿ¾` -|ÿÿÿþÿ¾?<*HnÿœHmðvN¹}¸`&=|ÿ¼ nÿl"h-Qÿ¾?<*HnÿœHmðvN¹}¸Hz(N¹©x` ;|ð‚?<HmðvN¹xHz0     U�?<N¹Åˆ=_ÿà=|ÿä n h h (T€-@ÿŒ?<*HnÿˆHnÿØN¹}¸=|ÿä?<#HnÿØN¹x`*LîÿˆHîÿØ=|ÿä n h h (X€-@ÿÜ;|ð‚?<*Hnÿ°HmðvN¹}¸?<?.ÿ¸N¹Å?<*HnÿØHmðvN¹}¸p°nÿøf?<?.ÿàN¹ÅHnÿ`N¹Î|N¹Ü N¹Ë8Hz´N¹©xN¹ÝŽ-n ÿ* nÿ*1|-hÿœ nÿœ .ÿòã€Ñ¨ n-hÿœ nÿœ .ÿòã€Ñ¨J.ÿñgN n h1| ?<* n/( n/(N¹}¸ n-hÿœ nÿœT¨ n-hÿœ nÿœT¨`8B'N¹Ã˜ n-hÿœ nÿœp°h WÀ2(HÁ/Hzp-@ÿ˜N¹ .ÿ˜À nÿœr²h VÁ‚‚(gtBnÿÀ"n"ip°i WÀ"n"iJiWÁÂg =| 1| |`æ n hp°�fb=|ÿøU�?<N¹Åˆ=_ÿà=|ÿä n h h (T€-@ÿŒ?<HnÿØN¹xBnÿä?<*HnÿˆHnÿØN¹}¸=|ÿä`*LîÿˆHîÿØ=|ÿä n h h (T€-@ÿÜ?<1HnÿØHnÿ°N¹}¸p°nÿøf?<?.ÿàN¹Å n Lî?ÿ°HÐ? n 1| Hnÿ`N¹Î| nJ(ÿ¨`Bnÿ¨?<& n/(Hnÿ N¹}¸ n-hÿ” nÿ”1| B¨B(1nÿ¨B¨" n-hÿœ nÿœp°h WÀ2(HÁ/Hzº-@ÿ˜N¹ .ÿ˜À nÿœr²h VÁ‚‚(gvBnÿÀ"n"ip°i WÀ"n"ir²iWÁÂg Bnÿ¨`=|ÿ¨?<& n/(Hnÿ N¹}¸ n-hÿ” nÿ”1| B¨B(1nÿ¨N¹©xJ®gÔ np°h$fÆ-nÿh=|ÿä nÿh .Ш-@ÿÈB.ÿÒp°hf=|ÿÌ-m÷Ìÿæ` =|ÿÌB®ÿæBgHnÿtN¹Çx?<&HnÿÄHnÿtN¹}¸=|ÿ”-|ÿxB.ÿ‚B®ÿ–+|ÿÿÿúïŠ;|ï’+mû6ï¨?<*Hmï†HnÿtN¹}¸Bnÿ”?<*HnÿtHmï†N¹}¸Bg?.ÿ|N¹ÅB­ï¨J-é¥g .ÿpS€/ -é �®ÿp?N¹ŠègŽ n p°h gH=|ÿÐU�?<N¹Åˆ=_ÿ¸=|ÿ¼?<*/. Hnÿ°N¹}¸/. N¹Î| n Lî?ÿ°HÐ?=|ÿÐ-|ÿÒBgHnÿ°/. N¹}¸-|ÿÒ?<)Hnÿ°/. N¹}¸N^ _Þü NÐASM_MPYNAÿü nJ¨ÿøg.-hÿøÿü nÿüJ�g nÿü-Pÿü`ì nÿü ­éº n+hÿøéºN^.ŸNuNAÿô-n ÿø nÿø0( HÀ/Hz`ø nÿlJ¨g/(HnÿøHnÿüN¹jÐ nÿlJ¨gð"h-Qÿð.ÿógR®ÿð .ÿü�®ÿø^ÀJ®WÁÀg6/<HnÿtN¹Ä„/.HnÿtN¹hv=|ÿ~LîÿtHîÿœ`J®g n hLÐ?Hî?ÿœp".ÿü’®ÿø-Aÿh°®ÿhn`-@ÿôJ®gLîÿœHîÿt nCîÿt!I/././.ÿð/.ÿôN¹ .П/ÔN¹-é©@À nÿø2( HÁ/Hz°-@ÿôN¹ .ÿô€gŽ nÿøp °h fU�/./(N¹áº_`dU�/. nÿø/(N¹áºJg |`@U�/. nÿø/(N¹áºJg"| nÿø-hÿü!h!nÿü`B.`B.N^ _Þü NÐ 0NAÿ” . lR€â€-@ÿò/.N¹ÒÎ/.N¹ nÿl/(?. /.NºüZ .ÿôR€hš`Ü nÿl-hÿìJ®WÀ"nÿìJ©VÁÂg6/<HnÿtN¹Ä„/.HnÿtN¹hv=|ÿ~LîÿtHîÿœ`J®g n hLÐ?Hî?ÿœJ®ÿìgZ-nÿìÿhJ®gLîÿœHîÿt nCîÿt!I/./. nÿh .Ш//( ?. /.NºûŒ nÿì-hÿì` ` ;|ÿøÿþNJN^ _ÞüÒÎ n h0( HÀ/HzN¹ n hÀ(g/.B'N¹g. n h0( HÀ/HzÞN¹ n hÀ(g/.B'N¹g.p°®ÿòWÀr²®ÿòWÁ‚gŒp°®ÿòf n h1| ` n h1| ?<* n/( n/(N¹}¸.g: n-hÿœ nÿœ (Ю S€!@ n-hÿœ nÿœNÐ FS_FINITB FS_FCLOSENAÿ*=|ÿÐU�?<N¹Åˆ=_ÿ¸ n h S€ã€2;Nû$Bnÿ¼`=|ÿ¼` =|ÿ¼`=|ÿ€U� n h h0(HÀ/N¹É¸=_ÿh n h h-hÿdB.ÿnB®ÿ‚Jnÿ¼f=|ÿ¼?<Hnÿ°N¹xBnÿ¼?<*Hnÿ`Hnÿ°N¹}¸ n/(Hnÿ0Hnÿ4N¹jÐ/-ÿö/Hz, (Ю S€!@`¬J®ÿòo¤Bnÿþ=|ÿÿÿüRnÿü=|ÿÿÿúRnÿú0.ÿüÁü 2.ÿúÃü4Ò€AíðÊÐüù¤JpWÀ2.ÿþHÁ²®ÿò]ÁÂgRRnÿþJnÿüf ?.ÿúN¹Êæ0.ÿüHÀЀ2.ÿú4èBãJAHÂЂtDÒ<ãªF‚Ŷêtv㫇¶ê`80.ÿüHÀЀ2.ÿú4èBãJAHÂЂtDÒ<ãªF‚Ŷêtv㫇¶ê nÿúmÿ< nÿümÿ(0.+Oÿö .ÿ0�®ÿ4 €ÿ\À@ÿ/+oÿöÞü Nú,_+_ÿöpü°mÿþf |ÿ/`NJLîÿ`Hîÿ8 n h P-hÿ`ŠU� nÿÎ"h/)N¹b¦Jg nÿÎ/(/(N¹ãÆ`ZJ-é¨g"NAÿþ/. N¹àðU� n h/(N¹b¦Jg |ÿÿ`B.ÿÿ np'°h fˆ/.N¹àðB'N¹Ã˜J.ÿÿg8U� n h/(N¹b¦JgHzbN¹©x` HzdN¹©x`4U� n h/(N¹b¦JgHzLN¹©x` HzNN¹©x` ;|ÿøÿþNJN^ _Þü NÐASM_SSUBTOSSUBASM_PSUBTOSSUBASM nÿÎ/(N¹Dd nÿÎ/(N¹Dd` nÿÎ/(N¹Dd nÿÎ/(N¹Dd nÿÎ"h"ip°iWÀ"hJQWÁÂgè/(N¹ÒÎ nÿÎ"h"i3| U�"h/)?<N¹û`Jg ?<*HmðN nÿÎ"h/)N¹}¸` nÿÎ/("h/)N¹hv nÿÎ"h-iÿÊ"nÿÊX©$h-jÿÆ$nÿÆp°jl0*HÀ/&h_SSUBTOPSUBASM_PSUBTOPSUBNAÿð/.N¹Dd-nÿü nÿü-hÿø"nÿøJ)g $n B`< nÿü"hp°if "n B` nÿøJh WÀ(A‚"n0) HÀ/Hz-AÿôN¹".ÿôÂg n B`Þ nÿü"hJiWÀ"(²­úDVÁÂ"hp°iWÀ‚Â-é¨g "n B`¤-nÿð/.N¹ÒÎ nÿð/(/+N¹Èb`?< nÿÎ"h/)N¹x nÿÊY¨"nÿÎ$i/*N¹Î|`U� nÿÎ"h/)N¹bXJg$ nÿÎ/(/("h"i//.Nºíb`Ò nÿÎ"h"ip°i f8/(N¹ÒÎ nÿÎ/("h/)N¹S° nÿÎ"h/)N¹Î|`† nÿÎ"h"ip°if/(/(/.Nºô@`\ nÿÎ"h"iN¹ÒÎ nÿð"hp*°i f$/("n"i?) "n"i)N¹Ï† n h"nÿð$i$j0* °h o n B`( nÿð/("n"i?) N¹ÓB nÿð"hp*°i fü0( HÀ/HzþN¹Jgp nÿð"h"iJ©"gX0( �| ã@2;Nû Bg"h/)"n/)N¹}¸` ?<G nÿð"h/)p°i f2/(/(Y�"h"i/"h"i/N¹Ï*/.Nºì¦` nÿÎ/(/(/.NºôhN^ _PONÐ ASM_ASSIGNASM_XSETASSIGNNAÿÌ n ¼-nÿÐ nÿÐ/(N¹Dd nÿÐ/(N¹Dd nÿÐp°h"WÀ"h$h"*²©^ÁÂpÿ°h"WÀ"h$h$*´©]ÂÄ„g"n B n Jgv nÿÐ"h-i"n/)N¹}¸N¹àD`r nÿð0( �|ã@2;Nû4"h"ip°©"f?<*"h/)"n/)N¹}¸`( nÿð"h"iJ©"f?<"n/)N¹x`Ú nÿð/(N¹l$ nÿð0( �| ã@2;Nû,’’’’NpBg"h/)"n/)N¹}¸`h?<G nÿð"h/)"n/)N¹}¸`F?<ÿÌ"h"i0("HÀ‘©"/("nÿÌ?) )N¹Ï† nÿÐ/("nÿÌ?) )N¹Ï† nÿÐ/(/(/.Nºó^-mé ÿü=|ÿô-|ÿö nÿÐp°h"f?<HnÿÔ"h/)N¹}¸`?<JHnÿÔ nÿÐ"h/)N¹}¸B'N¹Ã˜ nÿÐ/($"n/)N¹çü?<! nÿÐ"h/)"h/)N¹}¸Hnÿü<ÿHnÿÔN¹¬( n4 nÿð"h/)"n/)N¹}¸`$?< nÿð"h/)"n/)N¹}¸` nÿð0( HÀ/HzNN¹JgN¹àD nÿð"h/)N¹Î| n/(N¹Î| n ¼N^ _ÞüNÐ   NAÿØ=|ÿø-n ÿú;|ð‚?<*HnÿØHmðvN¹}¸N^ _PONÐNAÿØ=|ÿø0. HÀ-@ÿú;|ð‚?<*HnÿØHmðvN¹ÿÌJ(g4"nÿÐp°i"f?<HnÿÔN¹x`?<HnÿÔN¹x`0 nÿÐp°h"f?< HnÿÔN¹x`?< HnÿÔN¹xN^ _Þü NÐNAÿ†-n ÿŽ nÿŽ/(N¹DdB.ÿ” nÿŽ"hp*°i WÀ"hr*²i WÁÂg/. Hnÿ”/.Nºý´J.ÿ”f¤ nÿŽ"h-iÿŠ/(N¹ÒÎ nÿŽ"hp*°i f/("nÿŠ?)1     N¹}¸`?<JHnÿ° nÿŽ"h/)N¹}¸Hnÿ <ÿHnÿ°N¹¬( nÿŠJ(f?< Hnÿ°N¹x`?<Hnÿ°N¹xHnÿ˜N¹‘&B'N¹Ã˜N^ _PONÐNAÿü-n ÿü nÿüJ¨f?<ÿÿ"n/)Nºñ2`Z nÿü"hp*°i VÀ"h)A‚Â-é¨g/(/-úP<úN¹\ nÿü/(?<N¹ÓB nÿü/(N¹2;Nû\jjjjjjjjjjjj j CîþXEúÜGÑÀÚSbú$n$R<ÿHQHR-IþTN¹"nþTHQN¹©x`Hz¶N¹©x`B'N¹Ã˜`l-n ÿT nÿT/(N¹dŒ/< nÿT"h"i"iHi N¹_ÿÄJ.ÿÄg*/<HnÿlN¹Ä„=|ÿx?<*Hmð&HnÿlN¹}¸ nÿT"P/)N¹kJ-û(gHzkN^ _PONÐNAÿüU� n /(N¹b¦Jg/. N¹dŒ`Y�/<ÿ n h/N¹Ï* n 1@ÿ\0(ÿ\R@HÀ/HhÿlN¹Ä„ nCèÿ”-Iÿü"nÿü3| 0(ÿ\HÀ#@"Bhÿx?<*Hhÿ”HhÿlN¹}¸?<5 nHhÿlN¹x/. N¹dŒ nR¨ÿp?<5HhÿlN¹x;|ð‚?<* nHhÿ”HmðvN¹}¸B'N¹Ã˜HzBN¹©xNN¹©x` HzN¹©xB'N¹Ã˜J.ÿÄg�LîÿlHîÿ”=|ÿv nÿT"hEîÿl#J/(B'N¹g. nÿT"h"i3| /(Hnÿ”N¹hv=|ÿž nÿT"hEîÿ”#JB§/(B§"h"i/)Bg"n/)NºÎÂB'N¹Ã˜`2-n ÿT nÿT/(N¹ÒÎ/< nÿT"h"i"iHi N¹_ÿÄJ.ÿÄg2/<Hn )N¹Ï† nÿŽ/(N¹l$ nÿŽ/(N¹ÒÎ nÿŽ"hp*°i f/("nÿŠ?) )N¹Ï† nÿŠ"nÿŽ$i$j0* °h l/)?( N¹ÓB nÿŽ"h"ip°i WÀ"h"i)AÀg/(?<N¹ÓB nÿŽ"h"i$h$j0* °i l/("h"i?) N¹ÓB nÿŽ"h"ip°i WÀ"h nS¨ÿp?<5HhÿlN¹x?<5 nHhÿlN¹xHzN¹©xN^ _PONÐ ASM_MOVEL ASM_STRRTRIMNAþH-nÿX nÿXp°hf"n"i&/)/. B'N¹îØ`b nÿXp°hfr/(/. N¹ê nÿXp°hl;|ð‚0(HÀ/HmðvN¹ÈbU�/.BgN¹û`Jf/.HnÿlN¹ªf?<%HnÿlN¹xB'N¹"i)AÀg/(?<N¹ÓB nÿŽ"h"i$h$j0* °i l/("h"i?) N¹ÓB nÿŽ"hp*°i g¾"h"i=i ÿ¼0.ÿ¼ã@2;Nû./<Hnÿ°N¹Ä„`&/<Hnÿ°N¹Ä„`/<Hnÿ°N¹Ä„?<* nÿŽ"h/)Hnÿ°N¹}¸ nÿŽ"h"ip°i g4"h-iÿ†"nÿ†Ø`ä nÿX0(�|m̰|FnÄã@2;NûV�¸¸r,ŒŒŒŒŒŒŒŒhhhh¼¸¸¸ŒŒ¸¸ØØdøø¸¸Ž¸¸èè¸f²’¸Üܸ¸¸¸¸¸¸ÜÜܸ¸¸¸¸Üܸ¸ÜܸÜ"n -iÿô"n "Q-iÿð/.ÿðN¹ÒÎ/.ÿôN¹DdJ-é¨g¢ nÿô h0($HÀ-@ÿ^|ÿÿÀ3| B)B)Bi #nÿ´3nÿ¸#nÿÒ"B®ÿœJ-é¨g"U� nÿŽ/("h/)<N¹ZpU� nÿŽ/("h/)<N¹Zp€gâ nÿŽ"hp*°i f ?<!"h/)"h/)N¹}¸`?<Hnÿ° nÿŽ"h/)N¹}¸Hnÿœ/<N¹ nÿœB¨/.ÿœB'HnÿØN¹¬( nÿŽ"h"iJ)g0p°h"f nÿô (°­úhfÌ nÿô-hÿT nÿTBh Bh B(X¨ nÿðp*°h f/.ÿðBg<ÿN¹Ï† nÿð hJh o/.ÿô nÿð h?( N¹ÓB/.ÿðN¹l$ nÿð hJh WÀ nÿð hÀ(g-|ÿpBnÿx?<HnÿlN¹x?< nÿô/( nÿð/(N¹}¸ nÿôB¨`x nÿð hp°h gb=|ÿŒ-nÿ^ÿŽ-nÿðÿT n?<HnÿØN¹x`?<HnÿØN¹x`0 nÿŽp°h"f?< HnÿØN¹x`?< HnÿØN¹x nÿŽ"h/)Hnÿ¨Hnÿ¬N¹jÐ ®€ÿ¬^À nÿŽ"h"ir²i WÁ‚J®ÿ¨WÀÂg?<N"h/)N¹x nÿŽ"h"i=i ÿ’/("h/)<N¹\ nÿŽ"h"i3nÿ’ J®ÿ¨WÀ"h"ir²i WÁÂ"hÿT-hÿP"nÿPp°i f;i ð2?<!HnÿlHmð&N¹}¸`?<!Hnÿl nÿT/(N¹}¸`B.ÿÀJ.ÿÀg2-|ÿpBnÿx?< HnÿlN¹x-|ÿŽ?<LHnÿlN¹x/.ÿôN¹ÒÎ nÿô hBh /.ÿðBgN¹ÓB?<* nÿð/( nÿô/(N¹}¸ nÿð/(N¹Î| nÿô/(N¹Î|` n /(N¹dŒ n -PÿT nÿT/("ip°i WÀÀg?<N"h/)N¹x nÿŽ/("h/)<N¹\ nÿŽ"h"i3nÿ’ -mé ÿ  nÿŽ"hp*°i f ?<!"h/)"h/)N¹}¸`?<Hnÿ° nÿŽ"h/)N¹}¸Hnÿ˜B'Hnÿ°N¹¬( nÿŽ"h"iJ)g0p°h"f?<Hnÿ°N¹x`?<Hnÿ°N¹x`0 nÿŽp°h"f?<N¹ÓB nÿT/(N¹kHzBN¹©àB'N¹Ã˜`º n /(N¹dŒHz(N¹©àB'N¹Ã˜`–-n ÿT nÿT/(N¹dŒ nÿT"P/)/Nºú–HzfN¹©àB'N¹Ã˜`\-n ÿT nÿT/(N¹dŒ nÿT"P/)?<N¹ÓB nÿT"P/)N¹k nÿT"P"Q/)?<N¹ÓB nÿT"P"Q/)N¹kHz´N¹©xB'N¹Ã˜?< Hnÿ°N¹x`?< Hnÿ°N¹xmé¨ÿ•B-é¨ nÿŽ/(/(/.Nºìznÿ•é¨B'N¹Ã˜ nÿŽ/($"n/)N¹çüU�?<N¹Åˆ=_ÿ– nÿŽ"h"i0.ÿ–°ifÚ?<?.ÿ–N¹Å nÿŽ"h"i$nÿŠ0* °i l/("h"i?) N¹ÓB nÿŽ/(N¹l$=|ÿÐ-|ÿÒ nÿŽp°h"f?<Hnÿ°"h/)`æ nÿX/(/. N¹ê nÿXpN°h_ÀrR²h\ÁÂpG°hWÀ€rH²hWÁ‚gZ0(�|Gã@2;Nû&BBBBB&BB4Hz@N¹©x`Hz>N¹©x`Hz`N¹©x``Ø nÿXp=°hWÀr>²hWÁ‚g>CîþXEúHGÑÀÚSbú$n$R<ÿHQHR-IþTN¹"nþTHQN¹©à`‚ nÿX0(�|Fã@2     ÿlN¹Ä„=|ÿx?<* nÿT"h/)HnÿlN¹}¸J-û(g6 nÿT/(N¹dŒ nÿT"P/)N¹kHz¨N¹©xB'N¹Ã˜`*?< nÿT"h/)N¹x nÿT"h/)N¹Î|J.ÿÄgD=|ÿv nÿT"hEîÿl#JB§/(B§"h"i/)?<"n/)NºÍ B'N¹Ã˜` n /(N¹ÒÎJ-û(g& n /(N¹dŒHzð¤ nÿð h h/ nÿì/(N¹Ä„ nÿì h1nÿj nÿT/("nÿì/)N¹j2/.ÿìN¹dŒ` nÿT/(N¹dŒ` nÿT/(N¹Dd nÿP"hiÿ½J.ÿ¿g*U�/(N¹ð< nÿP"h0°i VÀ@ÿ¾` nÿP"h0.ÿj°i VÀ€.ÿÂÿ@ÿ¾.ÿ½€.ÿ¾gÎN¹Ü Hnÿì/<N¹ nÿT"h$nÿìLÑHÒrN¹©xB'N¹Ã˜`.+|ÿÿÿòïŠ+mû6ï¨?<*Hmï† n h/(N¹}¸B­ï¨`¦ n /(N¹ÒÎJ-û(g& n /(N¹kHzšN¹©xB'N¹Ã˜`4+|ÿÿÿòïŠ;|ï’+mû6ï¨?<* n h/(Hmï†N¹}¸B­ï¨`6 n -hÿð nÿXp°hWÀr²hWÁ‚p'°hWÀ€@ÿÆ0(HÀ/HzN¹_ÿÇJ.ÿÇ5i/.ÿìN¹ð¤.ÿ¿@À.ÿ¾gB nÿð h h/ nÿì/(N¹Ä„ nÿì h1nÿj nÿì1|$ nÿìB¨`6 nÿP"h/"nÿì/)N¹Ä„U� nÿP/(N¹ð< nÿì h1_ /.ÿìN¹dŒ`Ü.ÿ¿À.ÿÂg nÿT/(N¹à``¾J-é¨g„U� nÿT/(/.ÿè<ÿN¹ZpJgT|ÿÀ nÿT/(B'N¹g.N¹gAú4CîÿÚÀØSbú`AúôCîÿÚÀØSbú nÿð (°­údWÀ nÿXr²hWÁ‚p°hWÀ€@ÿ¿J.ÿ¿f,Cú–EîÿÐÀÙSbúU�"nÿð"i/)N¹ð<=_ÿj nÿXp°hf/.ÿðN¹à`` /.ÿðN¹dŒ n -PÿÌ nÿXp°hWÀr²hWÁ‚gX;|ð‚?<*Hmð&HmðvN¹}¸ nÿÌ/(?<N¹ÓB nÜ ;|ð‚ nÿP"hBi ?<*/(HmðvN¹}¸ nÿP"h3| ` nÿT/(N¹dŒ` nÿT/(N¹dŒJ.ÿ¿gJ.ÿÃg nÿP"h?)/.NºÝZ.ÿÁÀ.ÿ¿g.=| ÿŒB®ÿp nÿP-hÿŽ/(N¹Àè?<5HnÿlN¹xJ.ÿ¿gL nÿP (°­úPfCú FEîÿÐÀÙSbú`& nÿP (°­úTfCú &EîÿÐÀÿÌ/(N¹kHzPN¹©àB'N¹Ã˜ nÿÌ-PÿÌ`” nÿXp°hWÀr²hWÁ‚gz-nÿÌÿTU�"nÿT/)$Q/*N¹áºJf> nÿT/(?<N¹ÓB nÿT"P/)B'N¹g. nÿT/("P"i/)N¹j2 nÿT"P/)N¹dŒ nÿT"P-QÿÌJ®ÿÌg 6-nÿÌÿT nÿT-hÿPB.ÿÀJ.ÿÇf$"nÿP-iÿè$ip°jf $i#jÙSbú` nÿP (°­úLfCú EîÿÐÀÙSbú`ÚJ.ÿÁgAú îCîÿÐÀØSbú`¼J.ÿÂgAú ¤CîÿÐÀØSbú`žJ.ÿÃgAú ¸CîÿÐÀØSbú`€J.ÿÇg@ nÿP"hp°i fCú ŽEîÿÐÀÙSbú`Aú DCîÿÐÀØSbú`: nÿP (°­úHfCú REîÿÐÀÙSbú`Aú CîÿÐ;|ð‚J.ÿÆg?<*Hmð&HmðvN¹}¸`@J.ÿÇgÒJ.ÿ¿f nÿÌ-PÿÈ`$ nÿÌ P-PÿÈ nÿP (°­úLf "nÿÈ-QÿÈJ®ÿÈg� nÿXp°hVÀr²hVÁÂg?<*Hmð&HmðvN¹}¸``Líð&Hîÿ”-|ÿ˜;|ð‚?<*Hnÿ”HmðvN¹}¸;|ð‚-|ÿ˜?<*Hnÿ”HmðvN¹}¸?<*Hnÿ”HmðvN¹}¸`h nÀØSbú nÿXp°hWÀr²hWÁ‚g>CîþPEúÔGÑÀÚSbú<ÿHQHnÿÐ-IþLN¹"nþLAÑCîÿÐÀØSbú nÿP (°­úLWÀÀ.ÿ¿gRCîþPEúÆGÑÀÚSbú<ÿHQHnÿÚ-IþLN¹"nþL<þÿHQHnÿÐ-IþHN¹"nþHHQN¹©à`NAîþPCú:EÐÀÙSbú<ÿHPHnÿÚ-HþLN¹ nþL<þÿHPHnÿÐ-HþHN¹ÿÌJ�g^ nÿXp°hg?<*Hmð&HmðvN¹}¸`:Líð&Hîÿ”-|ÿ˜?<*Hnÿ”HmðvN¹}¸?<*Hnÿ”HmðvN¹}¸U� nÿP/(N¹bÐ_ÿÁU� nÿP/(N¹b¦_ÿÂU� nÿP/(N¹bX.ÿÂ@À@ÿÃJ.ÿÇg®B.ÿ½B.ÿ¾ nÿT/(N¹ÒÎJ.ÿ¿g¤ nÿP (°­úDWÀ"(²­úHWÁ‚"hJi WÀ"h) nþHHPN¹©à.ÿ½€.ÿ¾g¦N¹ÝŽJ-é¨g/.ÿì/.ÿè<ÿN¹\J.ÿ½g nÿT/(/.ÿìN¹x~`d nÿT/(N¹ÒÎJ.ÿÂg/.ÿì nÿT/(N¹ãÆ`8/.ÿì nÿP"h?) N¹ÓB/.ÿì nÿP/(N¹j2 nÿP/(N¹Î|`&J.ÿÀgN¹ÝŽ nÿT/(/.ÿè<ÿN¹\B'N¹Ã˜ nÿÌ-PÿÌ`õÆJ.ÿÆg˜B„Äg*"hp°i g"nÿT/)$h0* R@?N¹ÓB nÿP (°­úDWÀ"(²­úHWÁ‚g"nÿT/)N¹k`ØJ.ÿÁg& nÿT/(?<N¹ÓB nÿT/(N¹k`¬ nÿP (°­úPWÀ"(²­úTWÁ‚gB"nÿT/)BgN¹ÓB nÿP (°­úTf"nÿT/)N¹Z nÿT/(N¹k`N nÿP (°­úLf nÿXp°hfCú6EîÿÚÀÙSbú`8 nÿXp°hfCú"EîÿÚÀÙSbú`Aú<CîÿÚÀØSbúAîþXCú¤EÐÀÙSbú<ÿHPHnÿÚ-HþTN¹ nþTHPN¹©àB'N¹Ã˜`P n h h/(/. B'N¹îØ`0-n ÿT nÿT-hÿP|ÿÅ"nÿPp+°i f"$ip°jg$ip<°jfB.ÿÅJ."nÿT/)N¹dŒ`, nÿT/(N¹dŒJ.ÿÂf nÿP"h?)/.Nºàš nÿÌ-PÿÌ/.ÿÌ/Nºï2 nÿP (°­úLf"nÿÌ-QÿÌ/.ÿÌ/Nºï`êJ-é¨g nÿT/("nÿð"i/)<N¹\ nÿT/(?.ÿjN¹ÓB nÿP"h0) HÀ/Hmé’N¹Jf„Hnÿì/<N¹ nÿT"h$nÿìLÑHÒ5i/.ÿìN¹ÿÅgnJ-é¨g nÿT/(/-úH<úN¹\ nÿT/(?<N¹ÓB nÿT/(N¹ÒÎ;|ï’+|ÿÿÿþïŠ+mû6ï¨?<* nÿP/(Hmï†N¹}¸B­ï¨-| ÿŽ?<LHnÿlN¹x`^;|ï’+|ÿÿÿþïŠ+mû6ï¨J® gf-n ÿT nÿT-hÿPJ-é¨g/(/-úH<úN¹\ nÿT/(?<N¹ÓB nÿT/(N¹ÒÎ?<* nÿP/(Hm2     POSE HPM_RELEASE FS_FHPRESET ASM_NEWWORDS ASM_NEWBYTES UIO_UNITREAD UIO_UNITWRITENAÿøHnÿü/<N¹-nÿüÿø nÿø ­é "n !Q"n "®ÿüN^ _PONÐNAÿÔJ-é¨g�HnÿÔ/<N¹ nÿÔB¨/.ÿÔB'HnÿØN¹¬(?<HnÿØN¹x=|ÿø-n ÿú?<!HnÿØ/.N¹}¸-|ÿÜBnÿä?<B.ÿÃ0-ú&ÁüEíÔüøL-rÿÈJ.ÿÃfN¹LN^ _PONÐ256 entriescase table contains more than 2most case table entries address the same statementNAýþ n -hÿº nÿº0-ú(°hWÀ"n"i$i€*8gzB®ÿÌ3     N¹ nþ¶Hnþd"nÿº0)HÀ/-Hþ`N¹ÑP nþ`<þÿHPHnþd-Hþ\N¹ nþ\<þÿHPHzj-HþXN¹ nþXHnþ"nÿº0HÀ/-HþN¹ÑP nþ<þÿHPHnþ-HýþN¹ nýþHP/-é ?<N¹’ -é D€/N¹Š´N^ _PONÐ_NAÿÈ-n ÿÈ nÿÈ/(HnÿüB'N¹qÖ/.Nº·Ê nÿÈ/("n/)N¹çü nÿÈJ¨g$B®B®ÿö?<$HnÿÔN¹x`.p°®ÿüf;|ð2?<*HmðNHmð&N¹}¸?<6N¹w` ?<6N¹w -é U€ n h"h#@2 ­ÿÿ€û2l?<«HzPN¹à`.J-é¥f&J­é¶g mé¶/?-û4N¹ŒB mé¶+hé¶`ÜN^ _PONÐASM_CLOSEFILES0Refer to manual for details of stack allocation.NAþÿøHnÿôB'HnÿÌN¹¬(?<HnÿÌN¹x/.ÿüN¹‘&B'N¹Ã˜ nÿÈJ¨g&/("n/)N¹çüHnÿôN¹‘&B'N¹Ã˜N^ _PONÐNAÿð-n ÿðAîÿô-Hÿü-mé ÿôB®ÿøB'N¹Ã˜ nÿð/("n/)N¹çüJ-ûg?<LHmðžN¹x nÿð?(N¹Šˆ nCèÿø+Ié¾"nÿð/)Hnÿü<ÿN¹qÖN^ _PONÐNAÿÌ-n ÿÌJ® gÎ-n ÿÆ-mû.ÿü nÿÆ+hé²(VÀD@é¨(VÀD@é¦(VÀD@é§(VÀD@é©(VÀDr;Aé¢J¨ g*-h ÿÂB'N¹Ã˜ nÿÂJ( gîCîþÂHnþp0(HÀ/-IþlN¹ÑP"nþlAîþpEÑÀØSbú<þÿHQHz -IþhN¹"nþhHnþ nÿÂ0HÀ/-IþN¹ÑP"nþ<þÿHQHnþ-IþN¹-mé ÿüB'N¹Ã˜J-ûg?<LHmðžN¹x?-é´N¹Šˆ nCèÿø+Ié¾"nÿÌ/)HnÿøB'N¹qÖ/.Nº¶P nÿÌ/("n/)N¹çüHnÿü<ÿHnÿÐN¹¬(?<HnÿÐN¹x/.ÿøN¹‘&B'N¹Ã˜N^ _PONÐNAÿÄ-n ÿÄ+|ÿÿÿöïŠ;|ï’+mû6ï¨;|ð‚?<*Hmï†HmðvN¹}¸?<*Hmï®HmðvN¹}¸=|ÿøB®ÿÜB.ÿæ|"nþHQ/-é ?<BgN¹“PJ­é¶g.HnÿÊ/<N¹ nÿÊ!mé¶+nÿÊé¶ -é T€ nÿÊ €+|ÿÿÿÿïÚ?<&HmïÖHmïþN¹}¸ -é U€/?<N¹ŒB nÿÂ!mé |ÿJ(g /(N¹‘&-é¥@À-û nÿÆ2(HÁ/Hz*-@ÿÂN¹ .ÿÂÿAÂg?<LHmðžN¹x?-é´N¹Šˆ nÿÆp °hVÀr²møWÁÂÿÿúB®ÿüB®ÿÌ -é T€-@ÿÈ?<5HnÿØN¹x?<*HmïþHmï†N¹}¸B­ï¨R­öÜ nÿÄ/("n/)N¹çüS­öÜ+|ð*+|ÿÿÿöïŠ;|ï’+mû6ï¨?<*Hmð&Hmï†N¹}¸B­ð*=|ÿø-| ÿú;|ð ?<HnÿØHmïþN¹}¸=|ÿøB®ÿÜ=|ÿä|ÿúB®ÿüB®ÿÔ -é T€-@ÿÐ?<$HnÿØN¹xHnÿÈN¹‘&B'N¹Ã˜;|ïº?<Â-û'Â-ñ&g”J­éšfN¹„Hmñ.//-é²?<N¹/<-?<ÿÿN¹//-é ?<N¹< ?<ÿÿN¹R­éš -éš°­éªfHmñ.N¹B­éšJ­ÿêg|û$BmøB-ñ&/-é²HzLN¹LB®ÿøAîÿø+Hé¾ nÿÆ0(m°| nþã@2;Nû.JXl€Žœ¾°Ìîà/. /Nº¼"/Nº¬´`Î nÿÆ/(/(+HmðNHmï®N¹}¸?<*HmðNHmï†N¹}¸B­ï¨ nÿÄ/("n/)N¹çüHnÿÐN¹‘&B'N¹Ã˜N^ _PONÐNA/</. N¹Ä„ n 1| N^ _PONÐNAÿœ-n ÿ¬ nÿ¬/(N¹Dd nÿ¬-hÿ¨"nÿ¨-iÿ¤$nÿ¤pÿ°jVÀÀ*gV/<Hnÿ°N¹Ä„ nÿ¬!nÿ´=|ÿ¼=|ÿø=nÿôÿà?<*HnÿØHnÿ°N¹}¸?</NºÌN/Nº¬˜`²/. /Nºë`¤ n /(/.NºüÎ`�/. /NºÃ:/Nº¬b`|/. /Nºñ|`n/. /NºôX``/. /Nºõ/Nº¬2`L/. /Nºõv`>/. /Nºö`0/. /Nº÷ä/Nº¬`/. /Nºú`` ;|ÿøÿþNJ+nÿüû. nÿÆ-P `ü.N^ _PONÐP_Listing abortedNAÿü n+h nÿ¤?(N¹Å` nÿ¬B¨ nÿ¤p°h WÀr²hVÁÂp°hVÀÀr²h WÁ‚(€gü0(Áü4CíðÊÒüùªr²qVÀU�"nÿ¬/)-@ÿ N¹Ë\ .ÿ Àgt nÿ¤0(Áü4CíðÊÒüù¤Cñ-Iÿœ"nÿœ3|2¼#|$nÿ¨&jLÓHé Hi /Nºþˆ nÿ¨"nÿœ#h$nÿ¬/*Hi N¹hv`P nÿ¨"hLÑéž-méžÿü+mû.û2"nÿü;ié°0)R@;@é®p°if i8é¥`B-é¥ n"h )VÀD@é¨"h )VÀDr;Aé¢N^.ŸNuNAÿr n"hÿö"i p°iWÀU�"hÿö/) -@ÿvN¹b¦ .ÿv€gÐ n-hÿöÿrU�BgN¹Åˆ=_ÿüU�BgN¹Åˆ=_ÿúU�?<N¹Åˆ=_ÿþ nÿr+h&ïÚBnÿÂ=nÿüÿª=|ÿ®?<+HmïÖHnÿ¢?Hî?ÿ°Hnÿ°/NºþH nÿ¬/(Hnÿ°N¹hv nÿ¨"hLî?ÿ°HÑ? nÿ¨/(N¹Î|` nÿ¨/(N¹Î| nÿ¬/("n/)N¹çü nÿ¤0(Áü4CíðÊÒüù¤Cñ-Iÿ "nÿ p°if$nÿ¨ )°ªf3|N^ _PONÐNAÿ¨0-ú&ÁüAíÐüøHJ°VÀJmé°^ÁÂg$;|ð‚?<*Hmï®HmðvN¹}¸HzÂN¹©x-N¹}¸=|ÿÂ=|ÿš=nÿþÿ‚ nÿr"h p°if =|ÿ†`Bnÿ†=nÿ†ÿ®?<*Hnÿ¢HnÿzN¹}¸J-é¨g¤ nÿr"h p°if*=|ÿÂ"h U€-@ÿÄ?<Hnÿ¢HnÿzN¹}¸`j nÿr"h iÿ$gX=|ÿÂ"h 0)$HÀ-@ÿÄ?<!Hnÿ¢HnÿzN¹}¸-|ÿ~Bnÿ†?< HnÿzN¹x-|ÿœ?<LHnÿzN¹x nÿr+hû5gS­û2J-é¥g?<6N¹w`0?<OHmï®N¹xJmé°o n h-hÿ¨p°mé°]ÀÿråA"nÿ¨HÁÒ©$-Aÿüp°if$i p°jnX®ÿüJ®ÿüVÀr²®ÿüVÁÂg‚BnÿôBnÿÜ=|ÿà?<+HmðNHnÿÔN¹}¸=|ÿÌ-nÿüÿÎ ®€ÿül ;|ð `;|ð BgHnÿ¬HmïþN¹}¸=|ÿôB®ÿØB.ÿâBnÿÜïÚBnÿÂ=nÿúÿª=|ÿ®?<&HmïÖHnÿ¢N¹}¸=|ÿš=nÿþÿ‚=|ÿ nÿr"h p°if =|ÿ®`Bnÿ®?<*HnÿzHnÿ¢N¹}¸=|ÿš=nÿüÿ‚ nÿr"h p°if =|ÿ®`Bnÿ®?<*HnÿzHnÿ¢N¹}¸=|ÿš nÿr"h p°if-|ÿœ` -|ÿœ=|ÿÂ=nÿþÿª nÿr"h p°if =|ÿ®`Bnÿ®3     -pÿúJ®ÿúg.-nÿúþÖ/.ÿúB§B§ nþÖ/( Bg/.Nº˜@ nÿú-hÿú`Ì/Nºü N^.ŸNuHPM_HESTABLISHNA/Nºö”<öN¹Ã˜/NºüÔB­ïVB­ïRB­ïZB­ïNB­éºB­éš0-ñ,HÀ�üHÀ+@éª/. /NºòZN¹ÂJ­éšVÀÀ-ñ&À-û'g Hmñ.N¹N^ _PONÐNAÿ€<x/. ?<N¹U�/. nHhÿnHnÿ†Hnÿ‚Hnÿ€þF-_ÿø-nÿøÿô nÿô1| 0¼!n"n !Q n ®ÿø|ÿN^ _PONÐNA . °­úDWÀ". ²­úHWÁ‚ .°­úDWÀ$.´­úHW„ÄúBN^ _PONÐNAÿðB.-n ÿø nÿøp*°h WÀU�/.-@ÿôN¹bX .ÿôÀg„ nJ("g nÿø (°­úPWÀU�/(-@ÿðN¹bX .ÿð€g– nÿø (°­úPf-|N¹_ÿÿJ.ÿÿg–Hmçø?</. Hz’N¹ n!mÿêÿúHmçøHz|N¹ nJ¨ÿúgRp°¨ÿúf?<„N¹.;|ÿÿÿþNJ`. np °¨ÿúg?<‡?(ÿüN¹†$;|ÿÿÿþNJ`B.`|`B.N^ _PONÐPURGENAýRHmå®/<öN¹Hmé/<N¹HmæÚ/<N¹Hmçð/<N¹ÿü` nÿø"h0) HÀ-@ÿü n0($HÀ°®ÿümV|U� nÿø/(N¹b¦Jf: nÿøHhHh/.ÿüN¹d nÿø"h|" .ÿüR€"h"€"h2¼`¸U� n/(N¹eLJg¢ n h-hÿü nÿø (°­úPfHhHh/.ÿüN¹d|`hU� nÿø/(N¹bXJgR nÿø"hp°QfB"h0)?<JHnÿzHnÿ¢N¹}¸-|ÿÿÿúÿ~ nÿr"h p°if =|ÿ†`Bnÿ†?< HnÿzN¹xBg?.ÿúN¹Å?<?.ÿþN¹ÅBg?.ÿüN¹Å`Ü n"hÿö"i p°if>"hÿö/) Hnÿz/(Nº¢€p°nÿšg<=|ÿÂU�?<N¹Åˆ=_ÿª=|ÿ®?<*HnÿzHnÿ¢N¹}¸Lîÿ¢Hîÿz=|ÿÂ-|ÿÄBgHnÿ¢HnÿzN¹}¸B®N¹ÒU�Hmö^Hnÿ\HnþâHnþÞHnþÜN¹_ÿÿAîýÜCîÿ\EÐÀÙSbú<ÿÿHPHz.-HýØN¹ nýØHný^Hnþâ-HýZN¹>> nýZ<ýÿHPHný^-HýVN¹ nýV<ýÿHPHzð-HýRN¹ nýRCÐAîÿ€ÀÙSbú müœJ( g2Aîÿ€CíéÀØSbúU�Hmé/NºþJf müœB( `¾/-ÿ¦N¹/-ÿ¦/Hzž?<?<ÿÿÿÄ?<Hnÿ¢HnÿzN¹}¸;|ð ?<HHnÿzHmïþN¹}¸ n"hÿö+i&ïÚ;|ð‚?<*HmïÖHmðvN¹}¸+|ð*?<5Hmð&N¹xB­ð*?<*HnÿzHmðvN¹}¸?<?.ÿ‚N¹ÅN¹Ü N¹Ë8Hz¸N¹©xN¹ÝŽ;|ïâ?<*HmïþHmïÖN¹}¸`ŠU�BgN¹Åˆ=_ÿü n-hÿöÿr"nÿr$i R€lR€â€-@ÿò+i&ïÚBnÿÂ=nÿüN¹/Hnÿ€?<ÿÿN¹Hzf?<?<ÿÿN¹/-ÿ¢/<ÿxHméN¹N¹AíéCú&pR@± fS@föAîÿ€CíéÀØSbúU�Hmé/NºýZ_ÿÿJ.ÿÿf/-ÿ¦Hz$?<?<ÿÿN¹J.ÿÿgˆB-é�AíúxCúÄpR@± fBS@föAîýÜCîÿnEÐÀÙSbú<ÿÿHPHz˜-HýØN¹ nýØCÐAíúxÀÙSbúHmåÌ<üÿª=|ÿ®?<+HmïÖHnÿ¢N¹}¸=|ÿ nÿr+hïÚHnÿ¢HmïÖ/.ÿò<ÿB'Nº–Bg?.ÿüN¹ÅN^.ŸNu ASM_MOVELNAÿÄ0-ú&ÁüAíÐüøBAð-HÿÌ nÿÌ-hÿüJ®ÿüg²-nÿüÿÈ nÿÈ-PÿÄ"nÿÄJ)gŠB.ÿÓ=|ÿÐ0.ÿаm÷è_À.ÿÓAÀg: nÿÄ"P"Q$m÷Þ0.ÿÐHÀé€EòðpR@³ fS@fö|ÿÓ`RnÿÐ`°Hmúx?</-úœN¹-mÿêÿúJ®ÿúg0p°®ÿúf?<…N¹.`?<ˆ?.ÿüN¹†$;|ÿÿÿþNJAíúŠCúpR@± fBS@föAîýÜCîÿnEÐÀÙSbú<ÿÿHPHzî-HýØN¹ nýØCÐAíúŠÀÙSbúHmæâ<ýHmúŠ?</-ú N¹-mÿêÿúJ®ÿúg0p°®ÿúf?<†N¹.`?<‰?.ÿüN¹†$;|ÿÿÿþNJ/-ÿ¦N¹J.ÿÓg`$ nÿÄB(/HnÿÔN¹ªf?<%HnÿÔN¹x nÿü-hÿü`ÿJN^.ŸNuNAý|J-é¥fÈJ-ûg  n"h ?)N¹Šˆ n"h"QEÑCîÿ,ÀÚSbú.ÿ,À<ÿfp.ÿ,R@@ÿ,p.ÿ,Cîÿ,¼ÿ pr.ÿ,=AþذnþØn$=@ÿþ0.ÿþAîÿ,r0?N¹Š 0.ÿþR@hÖp.ÿ,R@?N¹Š ` BgN¹Š pN¹…œHmé–HzXN¹Hmé’HzNN¹B-å)AúZCíåÀØSbúAú6CíåÀØSbúAú>Cíå ÀØSbúB-ðÆN^Nun:EXEC.CODE") ? OVERLAYADDRESSOutput file (default is "Invalid file name. File ? J­åÐf HmåÌB§/<ÿÿÿÿN¹AíåÌ!mÿú+HÿúJ­ææf HmæâB§/<ÿÿÿÿ°mé°]Àÿr?N¹Š Jmé°ffB­é¶ n-hþÖ"nþÖ#mé .|ÿ,+mé åÄ"h//-é ?<BgN¹“P;|ïº?<'Hmï®N¹xJ-û(g HzÐN¹©x`p+|ÿÿÿÿåÄ n-hþÖ"nþÖ#mé .)@@,)+€)*g’J)+ftEîýÖHný„0)6HÀ/-Jý€N¹ÑP$ný€Aîý„CÒÀØSbú nþÖ"P<þÿHRHQ-JN¹Aíæâ!mÿú+HÿúJ­çüf HmçøB§/<ÿÿÿÿN¹Aíçø!mÿú+Hÿú/N¹NuNAÿøHnÿü/<N¹-nÿüÿø nÿø0¼B¨B¨1| -nÿüN^NuNAÿøHnÿü/<N¹-nÿüÿø nÿøB¨B�-nÿüN^NuNA .°­úDf | `2 .°­úHf | ` .°­úLf | `B. N^.Ÿý|N¹$ný|AÒCîþÚÀØSbúHnþÚ/-é ?<BgN¹“P` nþÖ//-é ?<BgN¹“PJ-é¥f Hmé¶/<N¹ mé¶B¨ -é T€ mé¶ €J-ûg$-|ÿ ?<LHnÿ~N¹xBgN¹Šˆ`;|ïº?<'Hmï®N¹x n"h-iÿöJ®ÿög(-nÿöþÖ nþÖp°h$f/Nº÷Œ nþÖ-hÿö`Ò0-ú&ÁüAíÐüøHNuNAÿôB. .°­úLWÀ n"²­úDWÁÂgZ-n ÿø nÿø-hÿü"n"­úLBHh/<N¹ nÿø-hÿô"nÿôBQ/.ÿüN¹ nÿôLŸH¨ |N^ _Þü NÐNAÿôB. n P-hÿü .ÿü°­úDWÀ".ÿü²­úHWÁ‚g~ .°­úLfr n Pp*°h f(U� n PHh n PHh/-úLNºÿ_`-nÿôÿì nÿì-PÿðJ(g ?< N¹. nÿìp °hf -hÿô`B®ÿô` ?<N¹. n hHhÿö/.ÿôHnÿðNºòÎ n-hÿüÿì"nÿì3|* BQ#múD|ú#nÿðN^.ŸNuðDNAþÚ n-h þæN¹3”p°mÿüfN¹3”|þê`*B.þê nþæp)°hVÀr(²hVÁÂg ?<ÿòp%°h ft-hÿî"nÿîJ©gb$iU�/)-JÿêN¹bX$nÿêÿ@À* nÿî"h-ûAÂ)$‚g""n "Qp°i$WÀÀ-ûf ?<šN¹. nÿò"hp°if "h!i n Pp°h$WÀ mú,r²PVÁÂg ?<šN¹.N^ _PONÐDNAÿè n0Cîÿö2À2ØU@bÿúY�Nºë–-_ÿò n ®ÿòN¹3”ÿöHm÷˜N¹HnÿàN¹8¢`ÿ\nÿõåN^.ŸNuNAÿüY�Nºä+_ú,-mú,ÿü nÿüBP1|* L­û�H¨0-ÿü�|"ã@2;Nû!múD`< nÿü!múL`.p°­ûŒf nÿü!múP`Y�?-ûŽN¹c0 nÿü!_N¹3”N^NuNAÿðY�Nºã‚+_ú,-mú,ÿü nÿü1|* BP"n!i "nL©H¨Cè-Iÿø"nJ®f,HnÿèHnÿöHz*N¹HnÿèN¹^ê?<~N¹.`¾ np°hf/./Nº÷€`˜-nÿî nÿîp°h$WÀr²h$WÁ‚p°h$WÀ€g|åHnÿèHnÿöHz¸N¹HnÿèN¹^ê mú,p$°h WÀÀ-åg*/< mú, hHhN¹Jg ?<¾N¹.B-åHn/Nºù¸ n-h nÿò!mú,p°mÿüfÿøJfÚ$i0mа|nÈã@2;Nû¼NHi/<N¹ nÿø-hÿô"nCé-Iÿð"nÿð$nÿô&i4“&iL« Hª `p n-hÿô nÿøHh"nÿô0<ÿ�i 2< ’@RAlRAâAHÁ/N¹ nÿø"h2¼"nÿô$h5i Hi $hHj 0) HÀ/N¹`N¹3”N^.ŸNuNAÿüY�NºâP+_ú,-mú,Y�Nºê| nÿò Ÿ nÿò-Pÿòp°mÿügþÜJ®g ?<~N¹.N^ _Þü NÐDDNAÿà n0Cîÿö2À2ØU@bÿúp°mÿüfîN¹3”múlÿëB-úlHnÿàHnÿöHzÜN¹HnÿàHnÿòHnÿìN¹@|nÿëúlJ® f?<žN¹.`š n J¨g*U� n h/( /.ÿòN¹hŠJf ?<oN¹. n -hÿòJ®ÿògF-nÿü nÿü1|$ 0¼"n!i !nN¹3”N^.ŸNuNAÿüY�Nºâ+_ú,-mú,ÿü nÿü1|) 0¼"n!i !n0-úÁüCíÒüøH!qN¹3”N^.ŸNuNAÿð n-hÿüÿð"nÿð3|+ 2¼#múD$h#j Y�HjÿöNºçÜ-_ÿôp°mÿüf N¹3”` ?<N¹.p(°mÿüffp °mÿúfY�B§Nºê nÿð!_ÿòÿæ nÿæ .ÿî°¨\À".ÿ_ÁÂg"n"�-h ` ` nÿæ-hÿò`´ n"n ‘B® `ÿ N^ _Þü NÐDNAÿØ n 0Cîÿö2À2ØU@bÿú-mú,ÿîN¹3”HnÿØHnÿöHz€N¹HnÿØN¹^ê nÿî-hÿêY�Nºè”-_ÿò-nÿòÿÞ nÿÞ1|% "nÿî0‘!nÿî!mú,J®ÿêgü"nÿêp°iVÀ"nÿêr²iVÁÂg`>p °mÿúfY�/<Nºéô nÿð!_`Y�B§Nºéà nÿð!_?<}N¹.N¹3”`Y�B§Nºé¼ nÿð!_?<}N¹.Y� n hHhÿöNºç~-_ÿøp°mÿüf N¹3”` ?<N¹.Y� n hHhÿöB'NºçÌ-_ÿü nÿð"h"®ÿü"nÿü"®ÿø"nÿø"®ÿôN^.ŸNuNAÿø n-hÿüÿü"nÿü3|+ 2¼$h#j #múX?<ŠN¹. nÿÞB¨`È nÿê"nÿÞ#hU� nÿê/( i/(N¹hŠJf ?<‹N¹. nÿÞ"hp*°i f€U�/.ÿêN¹b¦Jg( nÿê0($HÀ-@ÿæ-û@r-Aÿâ` nÿê/(HnÿâHnÿæN¹jÐ nÿÞ"h )°®ÿâ]À"h")²®ÿæ^Á‚g ?<.N¹.+nÿòú,p°mÿügþ’p°mÿüf N¹3”` Y�HjÿöB'Nºçl nÿü!_"h-iÿø"nÿøJQWÀJ©VÁÂg0$ip°jf?<}N¹.` -÷üR€/HzHN¹Lp°mÿüg nÿü"hB‘`$N¹3”Y� n hHhÿöNºæ nÿü"h"ŸN^.ŸNuB'ADDR' of a constant may not be supported on other implementationsNAÿø n-hÿüÿø"nÿø3|+ 2¼?< N¹.N^ _PONÐ@€NAÿà n 0Cîÿö2À2ØU@bÿúN¹3”Jmÿüg,?<N¹.HnÿàHnÿöHm÷˜N¹HnÿàN¹8¢`¢ mú,-hÿîJ®ÿîgŠ nÿîp °hg?<ŒN¹.`n nÿî/(HnÿòN¹WY�Nºæ˜-_ÿê-nÿêÿæ nÿæ1|( "mú,0‘!mú,!nÿòJ®ÿòfB¨?<˜N¹.` nÿò"nÿæ#h +n#múD$h#j Y�HjÿöBgNºêh-_ÿü nÿø!nÿüp°mÿüf N¹3”` ?<N¹.Y� n hHhÿö"h p/°iWÀNºæ nÿü Ÿ nÿü-Pÿüp°mÿüf N¹3”` ?<N¹.Y� n hHhÿöNºäê nÿü Ÿ nÿü-Pÿüp°mÿügY�/<ÿÿÿÿNºç> nÿü Ÿ` N¹3”Y� n hHhÿöNºä¤ nÿü ŸN^.ŸNu5      N¹. nþæ0(HÀ/Hz ÄN¹Jg"HnþÜ nHhÿöHz ¤N¹HnþÜN¹^êY�NºÛþ-_ÿü nþæ0(m >°|6n 6ã@2;Nûnn†Vövv€€Rââ 6 6 6 * *Ž˜ * * * * * * * * * * * * * * *¶¶¶ * * * n n * * * * *¬¬ *þ * * *¢-mú,þâ"nþâJ©gU�/)NºÛ¾Jf ?<}þæp °jf )R€Nv-@ÿð` nþÞ (S€Nv-@ÿð|ÿþë+oÿöÞü Nú",_+_ÿöpü°mÿþf?<-N¹.`NJ-nÿüþâ mú,"nþâ#hJ.þëgH3|* BQAé-HþÞ nþÞ¼þ!nÿð .ÿð°®ÿô]À".ÿð²®ÿø^Á‚g ?</N¹.`6 nþâ0¼"nþæp °if 1| ` nþâ1| nþâ!mú,`¨/NºòÖN¹.-nÿüþâ mú,"nþâ#hB.þë mú,p*°h fŒ nþæJhfü3|* BQ|þëEé-JþÞ )°­úDfV/-ÿö/Hz.+Oÿö$nþÞ¼þ&mú, +lD€Nv%@+oÿöÞü Nú,_+_ÿöpü°mÿþf ?<-N¹.`‚ nþâ (°­úLf^J-úlf ?<2N¹. nþÞBHh/<N¹ nþÞ"hBQ"mú,"i/)/) `ž/Nºôø`”/Nºñr`Š/NºóÊ`€-nÿüþâ nþâ1|+ 0¼!múD"n!i $nþæp$°jf2?<‹N¹.J.þêgY� nHhÿö?<NºÞ nþâ!_`Y� nHhÿö?<NºÝð nþâ!_`-nÿüþâ nþâ1|+ 0¼!múD"n!i Y�HiÿöNºÜ  nþâ!_B.þë"h-iþÞ"nþÞp*°i WÀ)AÂg6JWlW"hLŸH© ` nþÞ¼þB¨"nþâB©`† mú,J(gz/-ÿö/HzP+Oÿö mú,/(/N¹-_ÿð|ÿþë nþâ1|* BPCè-IþÞ"nþÞ¼þ#nÿð+oÿöÞü Nú",_+_ÿöpü°mÿþf?<-N¹.`NJJ.þëf2 nþâ0¼!mú,"nþæp°if 1|" ` nþâ1| `°-mú,þâ nþâJ¨-iþÚ$nþÚp°Rf$j þìHj Hnþí0* HÀ/N¹|þëJ.þëgœ/-ÿö/Hzz+Oÿö nþæ0(�| ã@2;Nû*HnþìN¹-_ÿð`"HnþìN¹-_ÿð`HnþìN¹-_ÿð nþâ1|* BP|!nÿð+oÿöÞü Nú,_+_ÿöJ-úlg ?<2N¹.`È-nÿüþâ nþâ1|+ 0¼!múT"n!i J.VÀ"(²­úDVÁ (°­úHVÀÀg ?<}N¹.-nÿüþâ nþâ1| 0¼!múP!mú,"mú,p*°i fj"mú,Cé-IþÞ"nþÞJf?<}N¹.`F nþÞJ¨]À ¨ÿ^Á‚g?<}N¹.` nþâ1|* BP"mú,L©H¨`à-mú,þâ nþâJ¨VÀ"(²­úDVÁ (°­úHVÀÀg ?<}N¹.-nÿüþâ nþêgH$nþæp)°jfY�Hiÿö?<NºÜd nþâ!_`Y� nHhÿö?<NºÜF nþâ!_`HY�NºÑ2 nþâ!_J­ú nÿÒ/(/( N¹LŸH®ÿâ` nÿÒ/(/( N¹LŸH®ÿâ+oÿöÞü NúN,_+_ÿöpú°mÿþWÀrù²mÿþWÁ‚pñ°mÿþ\Àtï´mÿþ_ÂÄ„g?<2N¹.LºzH®ÿâ`NJ nÿÚ1|* BPB("h!i"hL®ÿâH© nÿÚ"hBQ`?<}N¹.-nÿüþâ nþæp°hf"nþâ3|# ` nþâ1|! nþâ0¼!múD!mú,`T-mú,þâ-|€ÿô-|ÿÿÿÿø nþâJ¨g^-hþÞ"nþÞp°il?<}N¹.`< nþÞp°hf/(HnÿôHnÿøN¹jÐ` nþâ/(HnÿôHnÿøN¹jÐB.þë nþâp*°h f„Cè-IþÞ"nþÞJgr/-ÿö/HzH+Oÿö$nJ®ÿîg ?<~N¹.+nÿòú, mú,p+°h f mú,-hÿê`B®ÿê mú,Bh J®ÿêg6 mú,"nÿê"i0) °h o nÿê h"mú,3h nÿê-Pÿê`Ä nÿÞp°hf\Y�NºÌò-_ÿê mú,"nÿê"¨ mú,!nÿêY�NºÌ– nÿê!_ nÿê-hÿÚ nÿÚ0¼1|$ "nÿÞ!i&$mú,!jN^ _PONÐ ø;STRPO5     N¹Jg 0.ÿÒHÀá€2.ÿÔHÁÒ€R� nÿ¸!A ` 0.ÿÔS@h² nÿ¸!nÿÞ+nÿêú,N^ _PONÐ@€@€NAÿüY�NºÅà+_ú,-mú,ÿü nÿü1|$ B¨0¼!nN^.ŸNuNAÿâ n 0Cîÿö2À2ØU@bÿúJ-ûg ?<^N¹.J®f2HnÿâHnÿöHzŠN¹HnÿâN¹8¢p°mÿüfN¹3”`^ np°hf-@ÿêN¹ .ÿêÀgn nÿî0( ã@2;Nû "0>L1| `B nÿîBh `6 nÿî1| `( nÿî1| ` nÿî1| ` nÿî1| `ŽY�Nº½Â-_ÿò-nÿòÿæ nÿæ!múT"mú,p*°i g 0¼1| !mú,"h1i `BJ-úlf ?<2N¹. nÿæBP1|* Cè-Iÿâ"nÿâ¼ÿ$mú, *S€lHnÿö/.Nºù4`@?<�N¹.HnÿâHnÿöHz8N¹HnÿâN¹8¢p°mÿüfN¹3”/-ø.NºÿN^ _PONЀ€NAÿøY�NºÄØ+_ú,-mú,ÿü nÿü1|$ 0¼"n!i !n-nÿø"nÿøp°if?<gN¹.`4 nÿøp°hg?<–N¹.` nÿøJ(-f ?<±N¹. np°hf n|D€#@+nÿòú,N^ _PONÐüNAÿê n 0Cîÿö2À2ØU@bÿú0-ÿüHÀ/Hm÷¢N¹JfJ?<:N¹.HnÿêHnÿöHm÷¢N¹HnÿêN¹8¢0-ÿüHÀ/Hm÷¢N¹Jf Y�Nº¼º+_ú,0-ÿüHÀ/Hm÷¢N¹JgˆmåÿõJmÿügB-å0-ÿüã@2;Nûd$$$œ$$$$$$$$$$p$$$$$$$$$$$S does not conform to HP standard, see $SWITCH_STRPOS$NA÷º n 0Cîÿö2À2ØU@bÿúN¹3”J®WÀ@ÿòJ.ÿògTHn/<N¹-nÿ¸ nÿ¸1|B¨B(B( ¼1|B¨!|ïHh HmúN¹Y�NºË|-_ÿê-nÿêÿ¸ nÿ¸1|, 0¼!nB(B¨B¨B®ÿÞB®ÿÚ=|/.NºßÀHnÿöNºÜŒ`*/.Nºüäp°mÿüf ?<N¹.HnÿöNºÜd`N^ _PONÐNAÿø-n ÿø nÿøp°hg?<ŒN¹.`" nÿøp°hfJ(8g ?<ÀN¹.Hnÿü/<N¹Œ mú, (lмÿà€=@ÿÌ nÿî-hÿÄ .ÿÄlмÿà€=@ÿÒ .ÿÄ€ÿ=@ÿÐ0.ÿÒ°nÿÎodRnÿÎHnÿÖ/<&N¹-nÿÖÿ¸ nÿ¸B�HhHzÖN¹J®ÿÚg nÿÚ ®ÿÖ-nÿÖÿÚ`-nÿÖÿÚ-nÿÖÿÞ0.ÿΰnÿÒf¢`0-nÿÞÿÖp2.ÿÒSA=Aÿº°nÿºn=@ÿÔ nÿÖ-PÿÖ0.ÿÔR@hä=nÿÒÿÊ0.ÿÒ°nÿÌf mú, (€ÿ=@-nÿüÿø nÿøB(B( ¼1|Hh HmúN¹ n "nÿø#h n p°hf 3|` nÿø1|Y�NºÀâ+_ú,-mú,ÿø nÿøBP1|$ !nÿü!n N¹3”N^ _PONÐNAÿî n0Cîÿö2À2ØU@bÿúJmÿüg?<N¹.`À/:ÂHnÿòN¹X¸ nÿò0(ã@2;NûxŒ ^0´N¹3”p°mÿüÿÈ`=|ÿÿÈ0.ÿÐ=nÿÈÿº°nÿºnH=@ÿÔ nÿÖHhHnûº nÿÖHhHn÷ºHz0.ÿÔHÀ/N¹N¹HnûºN¹0.ÿÔR@h²0.ÿÈHÀЮÿÄ2.ÿÐHÁ��R€-@ÿÄ mú, .ÿݨmþ˜|þÿó`bJ.ÿôg/.ÿæ/< N¹ nÿæ-Pÿæ` nÿêHh/< N¹ nÿê-hÿæ-nÿæÿ¸ nÿ¸B�!nÿî!mú,|úÿôp°mÿüVÀfHnÿö nÿò/( Nºú€`Dp°mÿüfHnÿö nÿò/( Nºü¼HnÿöNºÚÊ`?<N¹.HnÿöN¹8¢/.ÿòNºú`ò/.ÿòNºÜXHnÿöNºÚ–`Þ/.ÿòNºÝvHnÿöNºÚ‚`Ê/.ÿòNºÝ¢HnÿöNºÚn`¶ nÿòp °h$WÀ€-åg:Y�Nº¿”+_ú,-mú,ÿî nÿî0¼1|$ "nÿò!i&!nÿòN¹3”`. nÿòp °h$g ?<gN¹./.ÿ@ÿõJ.ÿõfN¹3”J.ÿõgüp°mÿüf N¹3”` ?< N¹.J.ÿôg nÿê0¼` nÿêBP nÿêHh/<N¹ nÿê-hÿ¸ nÿ¸0¼B¨ J®ÿÞg®-nÿÞÿÖBnÿÒ nÿÖJ�g nÿÖ-PÿÖRnÿÒ`è0.ÿÒR@HÀá€S€-@ÿÄ n .ÿݨo n-hÿÄ .ÿÄ€ÿ=@ÿÐ0.ÿÐ @mH=@ÿÔ0.ÿÔHÀ/ nÿÖHhÿòHnÿöNºîØHnÿöNºÙò`:J-åg/.ÿò/Nºýˆ`/.ÿòHnÿöNºîªHnÿöNºÙÄ` /.ÿò/Nºýb-mú,ÿî nÿîJ¨g&"hp°iWÀ-åAÂg "h!iN^.ŸNuþNAÿâ n 0Cîÿö2À2ØU@bÿúN¹3”Hnÿö n/(N¹>-mú,ÿî nÿîJ¨VÀ"(²­úTVÁÂg ?<‡N¹. nÿîp°PWÀ2( HÁ/Hz6     $$$$$$$LLLŽmåÿõB-åNºØnÿõå`ÂHnÿöNºûd`¶måÿõB-åHnÿöB§Nºïônÿõå`˜Hnÿö/Nºý0`ŠN¹3”HnÿêHnÿöHzÂN¹HnÿêN¹^êJ­ú,VÀ mú,r²PWÁÂg mú,0¼ mú, (°­úLWÀ-úlAÀg ?<îN¹.p°mÿüf N¹3”` ?<N¹.`0-ÿüHÀ/HnÿöN¹ŽH®ÿÚ?<-N¹.`NJ nÿÖ1|* BP1| Cè-IÿÒ"h$nÿÒ%i"jL®ÿÚH© nÿÒ"hBQB`$ nÿÖ"hp*°i WÀÀ.ÿãgD0( �|m4°|n,ã@2;Nû     Þ"hJ)g4"hJ©f +hú,` nÿÖ"hp°©f+hú,`’ nÿÖ"h"iJQWÀ/: /:˜"h"iJf(?<N¹.HnÿêHnÿöHm÷¢N¹HnÿêN¹8¢`þdN^ _PONÐNAÿø n B� nAè-Hÿø nÿøJg:B®ÿüR®ÿü .ÿüå€AíÐüöê"nÿø")²°f n ®ÿü ®ÿümÌN^ _Þü NÐNAÿÎ-mú,ÿÖ|úÿã nÿÖ"h$h0* Ði 1@ "h-iÿø"h-iÿüJ®ÿøWÀJ®ÿüWÁ‚g B¨` ŒHnÿÒHz Œ/)/) -@ÿÒN¹ .ÿÒÀg nÿÖ+hú,`H nÿÖ"h"iJQWÀ/:^/:V"h"i/)/) -@ÿÎN¹ .ÿÎÀg nÿÖ+hú,`D nÿÖ"hJ)g0"hJ©f +hú,` nÿÖ"hp°©f+hú,``Ê nÿÖ"hp*°i WÀÀ.ÿãg²0( �|m¦°|nžã@2;Nû Þ’’’P"hHnÿÎHz ‚ nÿø0(HÀ/N¹/ nÿü0(HÀ/N¹N¹HnÿÒHz NN¹Jg?<†N¹.`d n0(ÿðã@2;Nû ´"ºº"nÿøp°ifR"nÿÖ3| U�/.ÿø/.ÿüN¹hŠJg$ nÿü"nÿø )°¨o nÿÖ!nÿü` ?<�N¹.`˜U�/.ÿøNº¹ÚU�/.ÿüNº¹ÐÀgn .ÿø°®ÿüg^U�/.ÿø/.J)g4"hJ©f +hú,` nÿÖ"hp°©f+hú,`’ nÿÖ"h"iJQWÀ/:F/:>"h"i/)/) -@ÿÒN¹ .ÿÒÀg nÿÖ+hú,`H nÿÖ"h"iJQWÀ/:/:ü"h"i/)/) -@ÿÎN¹ .ÿÎÀg nÿÖ+hú,`¶ nÿÖ"hJ)g"hp°©f+hú,`H nÿÖ"h"iÿüNº»J®ÿèg nÿÖ1| "h#nÿè`˜ .ÿø°­úDVÀ".ÿø²­úHVÁ .ÿü°­úDVÀ$.ÿü´­úHVÂÄ„g?<†N¹. nÿÖ!múD nÿÖ"hp*°i f "hJ©f?<,N¹.`† nÿÖp°h WÀ"hr*²i VÁÂg4/(Hnÿè/Nºü€J®ÿèg nÿÖ1| .ÿèD€"h#@`6 nÿÖp°h f("hJ©l?<¸Y�Nº°@-_ÿò=mÿúÿð-nÿòÿì0-ÿúã@2;Nû 4& nÿì1| `( nÿì1| ` nÿì1| ` nÿì1| mú,"nÿì#h2¼#mú,N¹3”HnÿâHnÿöHz nÿø0(W@m|°|ntã@2;Nû<hÚZ,hLL nÿÎ0( HÀ/HzhN¹Jf ?<ƒN¹.`. nÿÎ0( HÀ/HzBN¹Jgv nÿÎ"hJQWÀ"hJQWÁÂgX=h ÿî1|* BP|"h$h *°©fJnÿîWÀÿrg +hú,`" nÿÚ"hJ©WÀ"hÀ)g+hú,``l nÿÚ"hp*°i WÀÀ.ÿëgT0( �| mH°|n@ã@2;Nûz4444ê"hJ)g"hJ©f+hú,`H nÿÚ"h"iJQWÀ/:/:ú"h"i/)/) -@ÿÖN¹ .ÿÖÀg nÿÚ+hú,`¼ nÿÚ"hJ)g"hJ©!A`p°nÿîWÀÿ nÿÎr!A` ?<ƒN¹.`� nÿÎ0( U@mB°|n:ã@2;Nû  1| ` nÿÎ1| `?<„N¹.``>U�/.ÿøN¹bXJf ?<…N¹.`?<…N¹.`?<…N¹.` nÿÎ"hp*°i WÀ"hr*²i WÁÂg�"h$h)À*gJ-úlf ?<f+hú,`H nÿÚ"h"iJQWÀ/:’/:Š"h"i/)/) -@ÿÖN¹ .ÿÖÀg nÿÚ+hú,`L nÿÚ"hp°©WÀ"hÀ)g +hú,`" nÿÚ"hJ©WÀ"hÀ)g+hú,`N^.ŸNu0NAÿà n 0Cîÿö2À2ØU@bÿúB.ÿóp'°mÿüfd0-ÿúHÀ/HzHN¹JgL|ÿóp°m2N¹. nÿÎ"h-iÿð"h-iÿô=h ÿî1|* BP1| Cè-IÿÊ"nÿʼÿ0.ÿîã@2;Nû€ž &Db .ÿð°®ÿô]Àÿr#A`” .ÿð°®ÿô_Àÿ nÿÊr!A`v .ÿð°®ÿô^Àÿ nÿÊr!A`X .ÿð°®ÿô\Àÿ nÿÊr!A`: .ÿð°®ÿôWÀÿ nÿÊr!A` .ÿð°®ÿôVÀÿ n7     ÿúHnÿèHnÿöHzN¹Hnÿè/Nºõœp(°mÿüfà-úl@À-ûg ?<^N¹.Y�Nºœ-_ÿò-nÿòÿî0-ÿúQ@ã@2;Nû*8FT` nÿî1| `P nÿî1| `B nÿî1| `4 nÿî1| `& nÿî1| ` nÿîBh ` nÿî1| nÿî0¼!múT!mú,N¹3”Hnÿö/NºôÊ nÿî!mú,+nÿòú,p°mÿüf N¹3”` ?<N¹.Y� nHhÿöNºšj nÿü Ÿ nÿü-Pÿüp°mÿügY�/<ÿÿÿÿNºœ¾ nÿü Ÿ`N¹3”Y� nHhÿöNºš( nÿü Ÿ nÿü-Pÿüp°mÿügY�B§Nºœ€ nÿü Ÿ`N¹3”Y� nHhÿöNº™ê nÿü ŸN^.ŸNuNAÿì-mú,ÿôU� nÿô/(-@ÿðN¹bX .ÿðg4U� nÿô"h/)-@ÿìN¹eL .ÿì/Nº÷ÞN^.ŸNu€NAÿô0. ã@2;Nû.BVj~’¦ºÎâö Hnÿü/<N¹`îHnÿü/<N¹`ÚHnÿü/<.N¹`ÆHnÿü/<N¹`²Hnÿü/<(N¹`žHnÿü/<N¹`ŠHnÿü/<"N¹`vHnÿü/<N¹`bHnÿü/<N¹`NHnÿü/<f nÿô"h)"`Jf2 nÿô (°­úPVÀfp*°h VÀf`?<}N¹.`Œ nÿôp*°h f~(f"hp°QVÀf`d nÿô (°­úPfHhHh/<N¹d` nÿôHhHh"h0) HÀ/N¹d nÿô"h|""hR‘"h2¼N^.ŸNuNAÿòY� nHhÿö?<Nº�” n h"hÿè#_N¹`:Hnÿü/<"N¹`&Hnÿü/<N¹`Hnÿü/<N¹-nÿüÿø nÿø1n B�/-ÿö/Hz+Oÿö -÷üR€!@+oÿöÞü Nú,_+_ÿö nÿø!| nÿøCè-Iÿô"nÿô‘-ûïˆ�‘-ûëˆ�‘-ûíˆ�‘0-úvçˆ�‘-ûéˆ�-ûÀ.g|û nÿøB¨ -nÿü N^.ŸNu"hÿè-iÿüp°mÿügY�HzZNº›J nÿü Ÿ`BN¹3”Hnÿò nHhÿöHz2N¹HnÿòNºõžY�Nº’0 nÿü Ÿ"P#mú,/.NºþRN^.ŸNuNORMALNAÿô np°hÿôf$Y�Hhÿö?<Nºœè n h"hÿè#_`$Y� nHhÿö?<NºœÂ n h"hÿè#_p°mÿüfT n0(ÿôHÀ/HzRN¹À-ûg ?<NAÿð n0Cîÿö2À2ØU@bÿú nB�Y�HnÿöN¹’š-_ÿò nJ�f n ®ÿò` n P ®ÿò n ®ÿò0-ÿüHÀ/Hm÷¬N¹Jf²p°mÿüVÀÿ@ÿñp°mÿüfN¹3”J.ÿñgŒN^ _Þü NÐNAÿô n h-hÿèÿô"nÿô$i-jÿø$i-jÿüJ®ÿøVÀJ®ÿüVÁÂgÂ/<$nÿøHj N¹Jg ?<¾N¹.U�^N¹.N¹3”Hnÿö nHhÿöHzN¹HnÿöNºôÀ n h"hÿè-iÿüY�Nº‘@ nÿü Ÿ"P#mú,/.Nºýbp°mÿüfZN¹3”Hnÿö nHhÿöHzÂN¹HnÿöNºôd n h"hÿè"i-QÿüY�Nº�â nÿü Ÿ"P#mú,/.Nºý`v n h"hÿè"i-QÿüY�Nº�® nÿü ŸY�Nº�f nÿü"P#_"P-iÿø"nÿø#múhBQ/.ÿø/.ÿüN¹hŠJg$ nÿô"hp*°i f/.ÿø/(Nºœš`fU�/.ÿøNº˜tU�/.ÿüNº˜jÀg(U� nÿôHh/.ÿøNº™*Jf ?<�N¹.`$U� nÿô/(/.ÿøNº™üJf ?<�N¹.N^.ŸNuNAÿòY�Bg<Nºüf n!_ÿè-hÿèÿüHnÿòHhÿöHzvN¹Hnÿò/. NºÔº nÿü!mú,"mú,p°Qg ?<8N¹.p3|* B)Hi/< N¹ nÿø-hÿô"nÿô2¼Bi N^.ŸNuD€NAY� nHhÿö?<Nº›( n h"hÿè#_p°mÿüg ?<N¹.N¹3”Y� nHhÿöNº– n h"hÿè"i"ŸN^.ŸNuNAÿêB®ÿüB®ÿøJmÿüf¤/: HnÿôN¹X¸Hnÿê nHhÿöHzôN¹Hnÿê/.ÿôNºÌ¤ mú,J¨gd°mÿüg?<3N¹.`$N¹3” nHhÿöNºúÄ nÿü!mú,/NºþhN^ _PONÐNAÿîY�Nº—4 n h"hÿè#_"hÿè-iÿøJ. g$Hnÿî"nHiÿöHzN¹HnÿîNºú\` Hnÿî nHhÿöHzòN¹HnÿîNºÕè nÿø!mú,"mú,-iÿüJ®ÿügÀ"nÿüp°iVÀ"mú,JQWÁ‚g?<ÎN¹.`˜p°mÿüWÀÀ. mú,-hÿð nÿðp°hfBJ¨g6-hÿì"nÿì-QÿøJ)g ?< N¹. nÿìp °hf-hÿü` ?<}N¹.` ?<N¹. n h-hÿèÿð"nÿðHi/<N¹ nÿð-hÿì"nÿì#mú,$nHjÿö/.ÿüHnÿøNº¤ŽY�/.ÿøNº—J nÿì ŸN^.ŸNu0DNAY� n hHhÿö. Nº•„ n!_ÿü"hÿü g nHhÿö"nÿøHQ$nÿü/*Nºª²`jp°mÿüWÀ. AÂg> nHhÿö"nÿøHQ$nÿü/*Nºª~p°mÿüf N¹3”` ?<N¹.` nÿüJ¨g ?<~N¹.N^ _\ONÐDNAÿüY� nHhÿöp8°hÿôWÀÿNºœº-_ÿü n h"hÿè#nÿüp°mÿüf N¹3”` ?<N¹. np8°hÿôf"i!iÿðJ¨ÿðgf"hÿðp°ig?<}N¹. nB¨ÿð`B n"hÿðJ)f?<¸N¹.`$ n"hÿðJ)"g?<}N¹. nB¨ÿðN^ _\ONÐNAÿîY� n hHhÿö. Nº”Þ n!_ÿôY�Nº� -_ÿü-nÿüÿø nÿø1|% "n$iÿô!j$iÿô%nÿü$h0’B¨$h#jÿìJ©ÿìg8$iÿìp°jg?<Y�HhÿöNº›Œ nÿü Ÿ`Y� nHhÿö<ÿNºœR nÿü Ÿ nÿü-Pÿüp°mÿüf N¹3”` ?<N¹. np8°hÿôfY�HhÿöNº›Š nÿü Ÿ`Y� nHhÿöNº› nÿü ŸN^.ŸNuNAÿüY� nHhÿöNºšô-_ÿü n h"hÿè#nÿüp°mÿüf N¹3”` ?<N¹.Y� nHhÿöp-°hÿôWÀÿNº›† nÿü Ÿ nÿü-Pÿü}N¹. nB¨ÿì` n"hÿì$nÿø%ip°mÿüf N¹3”` ?<N¹.Hnÿî n hHhÿöHz’N¹HnÿîNºð† nÿø!mú,"nJ©ÿìgfU�$iÿì/*$mú,/*N¹hŠJf?<‹N¹. nB¨ÿì`2 nÿø"hp*°i f "hJ)f?<.N¹. nB¨ÿìN^ _\ONÐDNAÿØ np*°hÿôf7     }N¹.p°mÿüg?<N¹.`8N¹3”Y� nHhÿöNºŒb nÿú Ÿ nÿú-Pÿú np°hÿôWÀÿ@å`„ np°hÿôWÀr²hÿôWÁ‚g?<}N¹.`\ mú, (°­údVÀ n2(ÿôHÁ/Hz¶-@ÿäN¹ .ÿäÀg?<¸N¹.` mú, hJ¨f ?<}N¹.p°mÿüWÀÿ@ÿÿJ.ÿÿg*N¹3”HnÿÞ nHz@N¹HnÿÞNºáÚ`üLB-åJ®ÿúg nÿúB�N^.ŸNu@ ddddˆ€€NAÿô-mú,ÿôU� nÿô/(N¹bXJfH nÿô (°­úPWÀÀ. r*²h WÁÂgHhHh/<N¹d` ?<}N¹.`< nÿô"hJ)"f,"h/)HnÿøHnÿüN¹jÐp°®ÿøg ?<}HhÿöHz2N¹HnÿÞNºèÔ`( n0(ÿôHÀ/Hz2N¹Jf ?<N¹.`°|ÿÿ np°hÿôWÀr²hÿôWÁ‚g6J­ú-nÿüÿð nÿð0HÀ°­û’f|ÿû|f ?<™N¹.N^.ŸNu`@ @ ```NAÿîY�?<B'NºÔ¼ n!_ÿèN¹3” n-hÿèÿø"nÿøHiHnÿüHnÿîHhÿöHz�N¹HnÿîNºÖhp °mÿüfh -÷üR€ nÿø!@J-ûg|ûN¹3” nHhÿöNºÓ nÿø!mú,-mú,ÿô"nÿôJ©VÀ")²­úTVÁÂg ?<‡"nÿô#nÿü` nÿð-hÿü`°Jnÿø^À.ÿûAÀgÔSnÿø0.ÿøÁüAíÐüøF00HÀ/HzÖN¹JfÖ0.ÿøÁüAíÐüøL-pÿü0.ÿøÁüAíÐüøFr²pgRJ®ÿüVÀ.ÿûAÂg>-nÿüÿð nÿð0HÀ°­û’f| |ÿû"nÿô#nÿü` nÿð-hÿü`°JnÿøWÀ€.ÿû2.ÿøÃüAíÐüøFt´pWÁ‚N¹.` ?<5N¹.N^.ŸNu NAÿòY�?< <NºÓæ n!_ÿèN¹3” n-hÿèÿüHnÿòHhÿöHz€N¹HnÿòNºÒˆ nÿü!mú,-mú,ÿø"nÿøJ©VÀ")²­úTVÁÂg ?<‡N¹.p°mÿüf N¹3”` ?<6N¹.Y� nHhÿöN¹’š nÿü!_N^.ŸNuNAÿìY�?<<NºÓ, n!_ÿèN¹3” n-hgÿ0J.ÿûf ?<§N¹.N¹3”N^.ŸNu��NAÿòY�?<B'NºÚÜ n!_ÿèN¹3” n"hÿèHiHnÿüHnÿòHhÿöHz4N¹HnÿòNºÜŽp °mÿüf N¹3”` ?< N¹.N^.ŸNu@NAÿòY�?<<NºÚh n!_ÿèN¹3” n-hÿèÿüHnÿòHhÿöHzÆN¹HnÿòNºÙ nÿü!mú,-mú,ÿø"nÿøJ©VÀ")ÿèÿøJmÿüg4?<N¹.Hnÿî nHhÿöHz&N¹HnÿîN¹8¢B®ÿü`æ/:êHnÿüN¹X¸Y�N¹ûF nÿø!_-nÿüÿô-hÿð"nÿð3|$ $nÿô#j 2¼#nÿüp°j$VÀ2*²mú(VÁ‚g ?<‘N¹. nÿðJ¨gj"hp°il?<�N¹.`N/< nÿôHhN¹Jg?<¾N¹.`& nÿôHh²­úTVÁÂg ?<‡N¹.p °mÿüf N¹3”` ?<4N¹.Y�Hnÿò nHhÿöHzXN¹HnÿòN¹’š nÿü!_p °mÿüf$N¹3”Y� nHhÿöN¹’š nÿü!_` nÿüB¨N^.ŸNuNAÿð n h-hÿèÿð"nÿðJ©f#n #n $n Bª`Ä n -h ÿôB®ÿü nÿð-hÿøJ®ÿøg, nÿø ( HnÿìHhHz$N¹HnÿìN¹N¹3”p°mÿüg0?<3N¹.Hnÿî nHhÿöHzúN¹HnÿîN¹8¢`€N¹3”Hnÿî nHhÿöHzÔN¹HnÿîNºÐn nÿø!mú,U�"h/)"h/)N¹hŠJf?<‘N¹.`& nÿø"hp*°i f"h/)/(N¹ÿÊ0-ÿüHÀ/HzdN¹Jf0?<7N¹.Hnÿî n8     Nºë` /.ÿò/NºÎ’`”/Nºð`ŠRm÷ê/Nºò|Sm÷ê`xRm÷ê/Nº÷ Sm÷ê`f/Nºíî`\Rm÷ê/NºðHSm÷ê`JRm÷ê/NºõäSm÷ê`8Rm÷ê/Nºü€Sm÷ê`&Rm÷ê/Nºö”Sm÷ê`Rm÷ê/Nºú²Sm÷ê`0-ÿüHÀ/Hz\N¹Jf?<N¹.HnÿöN¹8¢`Y�?< B'NºÊ4-_ÿè nÿè!nÿì -nÿè N^.ŸNuN¹X¸ nÿî-h ÿâ-nÿæÿØ nÿØ-hÿê!nÿâJ®ÿâg8Hh HnÿÔHmúHnÿÐ"nÿâHi Hz–N¹HnÿÐN¹HnÿÔN¹ nÿØJ¨VÀJ¨VÁÂg"h.ÿáÀ)@ÿàJ.ÿàg\"h=iÿÜ0.ÿÜÐnÿÜr ²@l B.ÿà`:p°nÿÜl =|ÿÜ`&p°nÿÜl =|ÿÜ`p°nÿÜf=|ÿÜJ.ÿàg nÿØ|ÿ€€�¾d @NA0.°n o =n`=n N^ _PONÐNAþÎ n 0Cîÿö2À2ØU@bÿú-mÿòÿæ/-ÿ¦N¹J®gz/-ÿ¦/ n PHP?<ÿÿN¹/< U� n Ppr’@?Bg/NºÿpN¹/<[?<ÿÿN¹/Y�N¹?<N¹/<]?<ÿÿN¹N¹/-ÿ¦/<ÿ?<ÿÿN¹+møøB-û"B­öÜB­öØHnÿêHnÿîHnÿÌHnÿöHz@N¹HnÿÌNºÊ°Y�?< n(8@NºÈª nÿî Ÿp °mÿüf N¹3”` ?< N¹.0-ú&ÁüAíÐüøL-pÿòJ®ÿògˆ-nÿòÿÒ nÿÒJ(f`|ÿÖ< HnÿÖCîÿâ"¼HQ??<N¹?<¨AîþÒCú”EÐÀÙSbúHhHnÿø nÿüHhHz N¹HnÿøN¹N^.ŸNu   €€€‚NAÿæY�?< <NºÏ¶ n!_ÿèN¹3”=mú&ÿþ n-hÿèÿøJmÿüg0?<N¹.Hnÿæ nHhÿöHzLN¹HnÿæN¹8¢`²/:8HnÿðN¹X¸Hnÿæ nHhÿöHz"N¹HnÿæNº©¸ mú,-hÿôJ®ÿôgt nÿôp °hg<ÿHPHnÿÖ-HþÎN¹ nþÎHPN¹à nÿÒB(B(-hÿò`ÿtJ­øWÀÀ-ûg/.ÿê/.N¹õX-û"@À-ûg/.ÿê/.N¹Tæ+nÿæÿòB-úlN^ _PONÐ@Label: NAB-åB-åN^NuNuNAÿÊ n0Cîÿö2À2ØU@bÿúp*°mÿüf|ÿáN¹3”`B.ÿáp+°mÿüg,?<N¹.HnÿÒHnÿöHzêN¹?<ŒN¹.`Xp°mú&n?<–N¹.`@Rmú&0-ú&ÁüAíÐüøBAð-Hÿì nÿô"nÿì"¨3|#nÿø nÿø!mú,p°mÿüVÀÿ@ÿýJ.ÿýf&N¹3”Y�?< B'NºÎˆ nÿø!_ nÿø-hÿøJ.ÿýgþØp°mÿüf N¹3”` ?<6N¹.Y� nHhÿöN¹’š nÿø!_;nÿþú&N^.ŸNuBöBNAÿîY�HnÿÒN¹8¢`N¹3”p°mÿüf N¹3”` ?< N¹. n -PÿæHnÿâ/<&N¹-nÿâÿØ nÿØ!nÿæB¨B(B(B�1|B(!| 1|Hh HmúN¹ nÿØB("nÿá$Hh/<N¹ nÿØ-hÿÔJmÿüg?<N¹. nÿÔB�`Œ nÿÔHP/<,N¹ nÿÔ-PÿÐ"nÿÐHQHmÿ¨N¹d nÿÐ?<<NºÎ n!_ÿèN¹3” n-hÿèÿøR­öØ"nÿøHiHnÿüHnÿîHhÿöHzPN¹HnÿîNºÏ´S­öØp9°mÿüf$N¹3”Y� nHhÿöN¹’š nÿø!_` ?<ÈN¹.N^.ŸNu@NAÿÚ n0Cîÿö2À2ØU@bÿúB®ÿìp"°mÿüf ­'û’o ?<£N¹.=mú&ÿð0.ÿðÁüAíÐüøF00HÀ/HzN¹JB¨ B¨1|1mú(B¨ 1| $HhHnÿÌHmúHzªN¹HnÿÌN¹ nJ( f"nÿÔ/N¹\PN¹3”p3°mÿüf N¹3”`(?<N¹.HnÿÊHnÿöHzbN¹HnÿÊN¹8¢Jmÿüg?<N¹. nÿÔB¨`’ nÿÔHh/<,N¹ nÿÔ-hÿÐ"nÿÐHQHmÿ¨N¹d nÿÐB¨ B¨1|1mú(B¨ 1|gSnÿð`Ò0.ÿðÁüAíÐüøL-pÿìJ®ÿìgr-nÿìÿä nÿä0HÀ°­û’fPJ(g?<¥N¹.B®ÿì`. nÿä|ÿJm÷êVÀÀ( g ?<¤N¹. nÿä!möØ`` nÿä-hÿì`ˆ?<§N¹.N¹3”p°mÿüf N¹3”` ?<N¹.0-ÿüHÀ/HnÿÞHnÿöHz&N¹HnÿÞN¹Jf?<N¹.HnÿöN¹ $HhHnÿÌHmúHzÈN¹HnÿÌN¹ nJ( f"nÿÔ/)N¹\PN¹3”p°mÿüg,?<N¹.HnÿÊHnÿöHzŠN¹HnÿÊN¹8¢`N¹3”Jmÿüg0?<N¹.B®ÿîHnÿÊHnÿöHzTN¹HnÿÊN¹8¢`/:HnÿîN¹X¸J®ÿîgl nÿîJ¨ g0 nÿî h p°hm nÿî"nÿâ#h ` ?<qN¹8¢p°mÿüfN¹3”0-ÿüHÀ/HnÿÞHm÷¬HzÜN¹HnÿÞN¹Jgœ0-ÿüã@2;Nûr\\\\\\\\\\\\\\\\\\ÊÔ8æJø\\\\\\\\\\\\\\\\\\\\\\\\\\\\\&/:JHnÿòN¹X¸-nÿòÿÚ nÿÚp°hWÀr ²h$WÁÂp°hWÀ‚gHnÿö/.ÿò/. nÿÔJ�g"nÿî$P%i nÿÔJ¨g"nÿî$h%i -nÿâÿæN¹3”p°mÿüVÀÿ@ÿßJ.ÿßfJ.ÿág ?<ŽN¹.N¹3”J.ÿßgüÄp°mÿüf N¹3”` ?< N¹.p °mÿüf N¹3”` ?<N¹.p+°mÿüWÀr*²mÿüWÁ‚g(J.ÿág ?<ŽN¹.HnÿöHnÿâ/.Nºûº`¼Jmÿüfª/:ØHnÿî9     0Cîÿì2À2ØU@bÿú n0Cîÿö2À2ØU@bÿú0-ÿüHÀ/Hnÿ®HnÿöHz ‚N¹Hnÿ®N¹Jf:?<N¹.Hnÿ¤HnÿšHnÿìHnÿöN¹HnÿšHz HN¹Hnÿ¤N¹8¢p°mÿüf N¹3”0-ÿüHÀ/Hz @N¹Jf(?<N¹.Hnÿ®HnÿìHz þN¹Hnÿ®N¹8¢B®ÿÜB®ÿä0-ÿüHÀ/Hz N¹JgÀp°mÿüWÀr HnÿìN¹Hnÿ¤N¹8¢` ?<N¹.-nÿÊB®ÿä-nÿÊÿÎJ®ÿÜg-nÿÜÿ´ nÿ´-hÿà!nÿä0($Y@ã@2;Nû¦^^‚66ä Y�HnÿÊ/( <?<N¹Df nÿ´!_`°Y�HnÿÊ nÿ´/(&<?<N¹Df nÿ´!_`ˆY�HnÿÊ/-úX<ú?<N¹Df nÿ´!_`dY�HnÿÊ/-úh<ú?<N¹Df nÿ´!_²mÿüWÁ‚gè=mÿüÿÂN¹3”Jmÿüg?<N¹.`ÂHnÿØ/<*N¹-nÿØÿ´ nÿ´HPHmÿ¨N¹d nÿ´B¨ HhHmúN¹ nÿ´1|1mú(B¨ p °nÿÂf 1| $` nÿ´1| $ nÿ´!nÿÜ-nÿØÿÜJ. f /.ÿØN¹\PN¹3”p°nÿÂfHnÿ¸HzòN¹`Hnÿ¸HzäN¹0-ÿüHÀ/Hnÿ¸N¹`@Y�HnÿÊ/-úX<ú?<N¹Df nÿ´!_&J¨ g<"h p°ig$Y�Hmû./( B'?<N¹Df nÿ´!_` nÿ´!h&`Ú nÿ´-h ÿÔJ®ÿÔgÄ nÿÔp°hf¶ nÿÔ-hÿ° nÿ°J�g8"PJ© g. nÿ°-Pÿ¬Y�HnÿÊ"nÿ¬/) <?<N¹Df nÿ¬!_ nÿ°J¨gR-hÿ¬Y�HnÿÊ"nÿ¬/) <?<N¹Jf:?<N¹.Hnÿ®Hnÿ¤Hnÿ¸HnÿìN¹Hnÿ¤HnÿöN¹Hnÿ®N¹8¢Hnÿ®HnÿìHz†N¹Hnÿ® nÿØHh&?.ÿÂN¹ªp °nÿÂf€ nÿØ h&1|p°mÿüg?<{N¹.`ZN¹3”Jmÿüg?<N¹.`8/:úHnÿàN¹X¸ nÿà"nÿØ#h nÿà ( °­úhf ?<ÝN¹.N¹3”``p°mÿüf=|Df nÿ¬!_"nÿ°J‘gY�HnÿÊ/( <?<N¹Df-_ÿÆ nÿÔ-hÿÔ`ÿ8`-nÿÜÿä-nÿàÿÜ`ýà n ®ÿä .ÿÊ�®ÿÎlD€-@ÿÊ .ÿÊ€-@ÿÆJ®ÿÆg p�®ÿÆÑ®ÿÊ n ®ÿÊ` nB� nB�N^ _ÞüNЀ€`„<t„€€ €€ €€ ÿÒN¹3”`"p:°mÿüf=|ÿÒN¹3”`=|ÿÒB®ÿàJmÿüg?<N¹.`¢p°nÿÒWÀr²nÿÒWÁ‚gHnÿØ/<&N¹`HnÿØ/<*N¹-nÿØÿ´ nÿ´HPHmÿ¨N¹d nÿ´B¨ !nÿà1|1mú(B¨ 1nÿÒ$HhHmúN¹J. f /.ÿØN¹\P-nÿØÿàN¹3”0-ÿüHÀ/Hnÿ®HnÿìHz¾N¹NAÿä n0Cîÿö2À2ØU@bÿúHnÿò/<N¹-nÿòÿè nÿè1|B¨Hh HmúN¹ nÿèB(B( ¼1|B¨p°mÿüf´-mû.ÿîB­û.=mú&ÿìp°mú&o>Rmú&0-ú&ÁüCíÒüøBCñ-Iÿä"nÿäB‘3|B©B©B© B©` ?<–N¹.p°nf"HnÿöHzT nÿèHhHhB'B§Nºô`HnÿöHnÿ®N¹Jf(?<N¹.Hnÿ¤HnÿìHz®N¹Hnÿ¤N¹8¢p°mÿüVÀÿ@ÿÅJ.ÿÅfN¹3”J.ÿÅgþÖp°mÿüfâN¹3”JmÿüfJ/:N¹HnÿÊHnÿòHnÿÞN¹@| .ÿò°­úDf‚J®ÿà_À ®ÿÿà^Á‚g?<¦N¹.-|ÿÿàHnÿî/<&N¹ múh"nÿîLÐ?HÑ?3h$$-nÿîÿÐ nÿÐ1nÿâ$Hh "nHiÿÒN¹ .ÿàR€ nÿÐ €` ?<N¹.p°mÿüf N¹3”` ?< N¹9     N¹3”JmÿüfÀ n hJ(ÿßgHnÿò/<"N¹`Hnÿò/< N¹-nÿòÿ´ nÿ´B�B¨ 1|B¨B(HhHnÿúN¹B.ÿþB-û/:¢HnÿöN¹X¸|ûN¹3”J®ÿöWÀr²mÿüWÁ‚gÀ|ÿþ n|ÿàJ¨ÿòg "hÿò#nÿò n!nÿòÿò"h J‘f "h "®ÿò/.ÿòHmÿ¨N¹d/.ÿòN¹\Pp°mÿüÿ¨N¹d nÿÜB¨ B¨1|B(Hh"nHiÿÒN¹ n J�f n ®ÿêJ®ÿòg nÿò!nÿê-nÿêÿòJ®ÿîf-nÿêÿî/.ÿêN¹\PN¹3”` ?<N¹.0-ÿüHÀ/HzzN¹Jf(?<N¹.HnÿÖHnÿöHzlN¹HnÿÖN¹8¢p°mÿüVÀÿ@ÿáJ.ÿáfN¹3”J.ÿágþÒp°mÿüf N¹3”` ?<f N¹3”` ?<N¹.Jmÿüf/:üHnÿöN¹X¸N¹3”`,?<N¹.Hnÿ® nHhÿöHzæN¹Hnÿ®N¹8¢J®ÿög nÿö-h ÿÞ`B®ÿÞJ®ÿÞgF nÿÞp°hm. nÿò!nÿÞ nÿÚ!nÿòJ.ÿþg/.ÿò/.NºûŽ` ?<nN¹.`,?<N¹.Hnÿ® nHhÿöHzVN¹Hnÿ®N¹8¢ n"nÿÚhN¹.HnÿÖHnÿöHzN¹HnÿÖHnÿâN¹Å(J®ÿâg8/.HnÿÜ/.HnÿØ nÿâHh HzÄN¹HnÿØN¹HnÿÜN¹J®ÿîg(-nÿîÿÜ nÿÜ!nÿâ /.ÿî/NºóÀ nÿÜ-hÿî`Òp°mÿüfFN¹3”0-ÿüHÀ/Hz|N¹Jf(?<N¹.HnÿÖHnÿöHz`N¹HnÿÖN¹8¢`ýÄp°mÿüf /Nºõ¸` nB�.`HnÿÊHnÿöHzhN¹HnÿÊHnÿòHnÿÞN¹@|J®ÿòg nÿòJhg?<kN¹.B®ÿòHnÿî/<N¹-nÿîÿÐ nÿÐ1|Hh "nHiÿÒN¹ nÿÐB(J®ÿòg"nÿò ‘"nÿò1i!nÿà` nÿÐ ¼1|B¨ nÿÐ!nÿòp3°mÿüf N¹3”` ?<N¹.HnÿöHnÿòHnÿÞN¹@|-nÿîÿÐJ®ÿà/.ÿÚ/(Nºúxp °mÿüf N¹3”` ?<N¹.B®ÿÞ n h-hÿäÿÒ-hÿäÿÖ=hÿàÿÂ=hÿàÿÀB®ÿâHnÿ® nHhÿöHzÚN¹Hnÿ®HnÿæHnÿÄN¹@| nÿÚJ¨g*U� nÿÚ h/( /.ÿæN¹hŠJf ?<oN¹.Hnÿæ/<&N¹-nÿæÿ´ nÿ´!nÿÞ!nÿâB¨"!nÿÆ1| Hh HnÿúN¹p3°mÿüfvÿòg0 nÿÐ!nÿàJ¨VÀ"(²®ÿòVÁÂg ?<kN¹.` nÿÐ!h nÿÐ (°¨o?<fN¹. nÿÐ!h nÿÐ/(HnÿÚHnÿÕN¹Cº nÿÐ/(HnÿÜHnÿÖN¹Cº0.ÿÚ°nÿÜo=nÿÚÿÜ.ÿÕ€.ÿÖgRnÿÜp °nÿÜo\ nÿÐ|ÿ1nÿÜ.ÿÕ€.ÿÖÿ@ ( @rÒnÿÜp°A\À"(²­úDWÁÂJ-ûg ?<^N¹.N¹3”Hnÿ® nHhÿöHzN¹Hnÿ®HnÿâHnÿÄN¹@| nÿÚJ¨g*U� nÿÚ h/( /.ÿâN¹hŠJf ?<oN¹. nÿæ!nÿÆ nÿæ (°®ÿÆo ?<fN¹.-nÿæÿÞ-nÿæÿâp°mÿüVÀÿ@ÿÿJ.ÿÿfN¹3”J.ÿÿgþŽp°mÿüf N¹3”` ?<N¹.p°mÿüf N¹3”` ?< g ¼!múH` nÿÐB( n ®ÿî0-ÿüHÀ/HnÿöN¹Jf?<N¹.HnÿöN¹8¢` n B�N^ _Þü NÐ�DDÄ€NAÿü-n ÿü nJhÿào 0(ÿàP@S@l^@æ@HÀШÿä"nÿü"€` n"nÿü"¨ÿä nÿüB(p°�WÀ"nr²iÿâWÁÂg 1|` nÿü1| nJ¨N¹.p°mÿüf B®ÿâ`Þ nB¨ÿæHnÿúHmúN¹Hnÿ® nHhÿöHzöN¹Hnÿ®HnÿâHnÿú nHhÿæ/(N¹¼J-nÿÞÿîJ®ÿîg0 nÿîJ¨"f n"nÿî#hÿæ""nÿî-iÿî```Ê/<HnÿúN¹Jg ?<ÃN¹. n/(Hnÿ´/(Hnÿ°HnÿúHzJN¹Hnÿ°N¹Hnÿ´N¹ n h0(ÿàÿäWÀr ²hÿà^ÁÂ(ÿß@Àg"nÿü|ÿB) 3hÿà` nÿüB(N^ _PONÐNAÿú-n ÿú nÿúJ¨ fB¨B(`< n h"nÿú$i (ÿßÀ*gJJhÿàf. (ÿä€=@ÿþJnÿþg0.ÿþHÀ‘¨ÿä0.ÿþHÀç€1@ÿà/-ÿö/HzR+Oÿö n h"nÿú$i 0*ÐhÿàNvr ²@lT¨ÿäNvhÿàNvJhÿàlBhl^@æ@HÀШÿä-@ÿ¸0.ÿÀl^@æ@HÀЮÿÖ-@ÿ¼0.ÿÀ@2(ÿàA°A]À".ÿ¸²®ÿ¼WÁÀ".ÿ¸²®ÿ¼^Á€g-hÿäÿÖ=hÿàÿÀJ®ÿæg. nÿæ-hÿê nÿæ!nÿâ/.ÿæ n/(Nºöü-nÿêÿæ`Ìp°mÿüfdN¹3”0-ÿüHÀ/Hnÿ® nHhÿöHzlN¹Hnÿ®N¹Jf,?<N¹.Hnÿ¤ nHhÿöHz@N¹Hnÿ¤N¹8¢` ÿà`Â+oÿöÞü Nú2,_+_ÿöpü°mÿþf ?< N¹. n hB¨ÿäBhÿà`NJ n h"nÿú#hÿä|ÿ3hÿà $i 0*ÑhÿàJi WÀr²i WÁ‚$i p°jWÀÀ$i À* g0) l^@æ@HÀÑ©B)| n hp°hÿâo1|ÿâ`Ø n hJhÿàop/-ÿö/Hz.+Oÿö0(ÿàP@NvS@Nvl^@æ@HÀѨ?<N¹.p°mÿüVÀÿ@ÿÿJ.ÿÿfN¹3” n h!nÿÒÿä1nÿÂÿàp °mÿüWÀ€.ÿÿgü n h!nÿÖÿä1nÿÀÿà"nÿÚ#nÿÞJ®ÿÞg¤ nÿÞL¨H®ÿÊ nÿÞ-hÿâJ®ÿâgt nÿâAè-Hÿ´ nÿ´ .ÿʰ�\À".ÿʲ¨_Á .ÿΰ�\À$.ÿδ¨_ÂÄ„ .ÿʰ�]À".ÿβ¨^Á‚g?<œN¹.` ` nÿâ-hÿäNv+oÿöÞü Nú.,_+_ÿöpü°mÿþf?< N¹. n hB¨ÿä`NJ n hBhÿà nÿúB("n"iiÿßY�Hiÿä/( <?<N¹Df nÿú!_"h $n$j0*ÿâ°il "h 5iÿâN^ _PONÐNAÿ¤HnÿÚ/<N¹HnÿúHmúN¹-nÿÚÿ´ nÿ´B¨B¨1| Hh HnÿúN¹ n"h"®ÿÚÿâ`† nÿÞ-hÿÞ`ÿXN^.ŸNu€€ hhNAÿÖ n0Cîÿö2À2ØU@bÿúB.ÿàB®ÿò0-ÿüHÀ/HzžN¹Jf(?<N¹.HnÿÖHnÿöHz‚N¹HnÿÖN¹8¢Jmÿüf8|ÿàB®ÿîJmÿüf¼ nJ(ÿßgHnÿê/<"N¹`Hnÿê/< N¹-nÿêÿÜ nÿÜHPHm:     N^ _ÞüNÐ``€@€p„@€NAÿôHnÿü/<N¹ n"h"®ÿü-nÿüÿô"nÿôB©3|B)B)"¼3|Hi HhÿÒN¹N¹3”JmÿüfLHnÿø/<N¹-nÿøÿô nÿôHPHmÿ¨N¹d nÿô!nÿü !mø"Bh+nÿøø"N¹3”` ?<N¹.N^.ŸNuNAÿü/-ÿöÿîÿÊ0-ú&Áü nÿÊCíÒüøB!q!nÿò/.ÿî/NºêZ nÿÊ1| Hh HnÿÒN¹;nÿìú&p °mÿüf N¹3”` ?< N¹. n ®ÿî`¦p)°mÿüf:N¹3”p °mÿüf N¹3”` ?<N¹.HnÿöHnÿò/Nºã�J®ÿòg< nÿòp°hl?<sN¹.B®ÿò` .ÿò°­úDf?<©N¹.B®ÿòHnÿî/<N¹/Hz*+Oÿö/. n/(ÿàN¹-_ÿü+oÿöÞü Nú:,_+_ÿöpü°mÿþf*?<¹N¹.J® g n p°hf n B¨N^ _Þü NÐNAÿÐN¹3”p°mÿüf N¹3”` ?< N¹.B®ÿøHnÿô/<&N¹-nÿôÿØ nÿØ!nÿøB¨"niÿß$B(B( ¼1|B(!| 1|Hh HiÿÒN¹-nÿîÿÊ nÿÊ!nÿò1|Hh HnÿÒN¹ nÿÊB(B(B�1|B¨!|ÿoJ®ÿòg^/.ÿòHnÿÖHnÿÚN¹jÐJ®ÿÖ]À ®ÿoÿÚ^Á‚g?<’N¹.`( nÿÊ!nÿÚ!nÿÖpЮÿÚlмè€ã€T€ € n ®ÿî`dp-°mÿüf$N¹3”Hnÿî/<N¹-nÿîÿÊ nÿÊB(B(1|1| Hh HnÿÆHn nÿØB("-nÿôÿøHnÿÒ nHhÿöHzN¹HnÿÒHnÿü/.NºêJ®ÿügB nÿüp°hm* .ÿü°­úDf?<•N¹.` nÿô!nÿü` ?<qN¹.p°mÿüVÀÿ@ÿíJ.ÿífN¹3”J.ÿígþþp°mÿüf N¹3”` ?< N¹.p °mÿüf N¹3”` ?<N¹. nHhÿöHnÿôN¹Å(-nÿøÿØ nÿØ-hÿüÿÒHzTN¹HnÿÆN¹p °mÿüfxN¹3”Hnÿö nÿÊHhNºûô nÿÊJ¨gR"hJ‘_À"h ‘þ^Á‚g?<¡N¹.`*/< nÿÊ"hHi N¹Jg ?<·N¹.`J-ûf ?<_N¹. nÿÊB¨ nÿÊJ¨f ¼` nÿÊ"h <–Б € n ®ÿî`8p°mÿüf.-û€-ûf ?<dN¹!nÿôJ®ÿôg?<uAîþ¢Cú”EÐÀÙÿØB(-hÿÔ"nÿÔJ)g ?<£N¹. nÿÔ0(HÀÐ�S€/0(HÀ/-HÿÐN¹ nÿÐ0(HÀ/N¹-_ÿð nÿØ!nÿð 1| nÿØ|ÿ/(HnÿàHnÿäN¹jÐJ®ÿäl .ÿàмÿÿÿ°®ÿä^Àÿ@ÿï` .ÿä�¼ÿÿÿ°®ÿà]Àÿ@ÿïJ.ÿïg. .ÿä�®ÿàR€-@ÿÜ nÿØJ(g”p°h f> ®?ÿÿÿÿÜ]À?@ÿïSbú"nÿª"Q<ÿÿHPHQ-HþžN¹ nþžHPN¹à` nÿ¢"nÿª"i #h `J.g nÿª h !mú\ nÿª-hÿª`ÿ8Aîÿ®Cíÿ¨ÀØSbú|ÿûN^ _TONЀUndefined type NAþ¢Aíÿ¨Cîÿ®ÀØSbúB-ûJ­ø"gþ mø" PCÐAíÿ¨ÀÙSbú/:Hnÿ¦N¹X¸J®ÿ¦f²J.gL?<uAîþ¦CúâJ.ÿïg .ÿÜã€-@ÿð/< nÿØ/(/NºûÔ`J|ÿï nÿØJh f B®ÿð`0 nÿØp�è =@ÿê0.ÿêS@HÀЮÿÜ/0.ÿêHÀ/N¹-_ÿð`n nÿØ"hJ)g B.ÿï`&/<ÿÿÿ/.ÿÜN¹ nÿØ ( °Ÿ_À@ÿïJ.ÿïg nÿØ/( /.ÿÜN¹-_ÿð nÿØ/( /(/NºûJ.ÿïg nÿØ ®ÿðB(-nÿøÿô-nÿüEÐÀÙSbú"mø""Q<øÿHPHQ-Hþ¢N¹ nþ¢HPN¹à mø"+hø"`\ mø" h !mú\ mø"-hÿª0-ú&ÁüAíÐüøP p P"mø"#h0-ú&ÁüAíÐüøP p P!mø"+nÿªø"` nÿ¦"mø""i #h  mø"+hø"`þþAîÿ®Cíÿ¨ÀØSbú|ÿûN^ _TONЀUndefined type NAÿÜ n0Cîÿö2ÀÿøJ®ÿøfüè n"h"®ÿôN^.ŸNu`@€NAÿº n 0Cîÿö2À2ØU@bÿúB.ÿßHnÿÒHmúN¹0-ÿüHÀ/Hm÷zN¹Jf(?< N¹.HnÿÄHnÿöHm÷zN¹HnÿÄN¹8¢0-ÿüHÀ/Hm÷zN¹Jg¤0-ÿüHÀ/Hm÷pN¹JgHnÿö/./Nºåt`Jp°mÿüf /NºùX`6p*°mÿüfLN¹3”|ÿß0-ÿü2ØU@bÿúN¹3”p"°mÿüg?<N¹.`Ô0-ú&ÁüAíÐüøBAð-Hÿì nÿì-h ÿòB.ÿñJ®ÿòVÀ.ÿñAÂg2 nÿò0HÀ°­û’g nÿò-hÿò`|ÿñ?<¦N¹.`¼J.ÿñf\Hnÿò/<N¹ ­'û’o ?<£N¹.-nÿòÿè nÿè0­û”"nÿì!i B(B(B( 1mú(B(#nÿò N¹3”0-ÿüHÀ/HÀ/Hm÷¶N¹Jf(?< N¹.HnÿÄHnÿöHm÷¶N¹HnÿÄN¹8¢p+°mÿüf /Nºú*`Îp,°mÿüf N¹3”=mú&ÿìp°mú&o,Rmú&0-ú&ÁüAíÐüøBAð-HÿÊ nÿÊB�Bh` ?<–N¹.B®ÿäBnÿà=|ÿâB®ÿÎHnÿÄHnÿºHnÿöHzšN¹HnÿºHz�N¹HnÿÄHnÿòHnÿÒHnÿÎ/Nºõ^Hnÿî/<N¹-nHnÿæHnÿöHzˆN¹HnÿæN¹Jf(?<N¹.HnÿÜHnÿöHz`N¹HnÿÜN¹8¢p°mÿüVÀÿ@ÿðJ.ÿðfN¹3”J.ÿðgþ¢p°mÿüf N¹3”` ?<N¹.N^.ŸNuPPNAÿÐ n 0Cîÿö2À2ØU@bÿúN¹3”Jmÿüg(?<N¹.HnÿÚHnÿöHznN¹HnÿÚN¹8¢JmÿüfNHnÿò/< N¹:     °­úPg?<2N¹.`šp.ÿá�|Lm‚°|'nzã@2;NûPnnnnn`TnnnnnnnnnnnnnnnnnnnnnnnnPnnnnn`T`& nÿæBh$` nÿæ1|$` ?<2N¹.p°mÿüf N¹3”` ?< N¹.` ?<N¹.0-ÿüHÀ/HnÿÐHnÿÆHnÿöHzŽN¹HnÿÆHm÷¶-| ÿäp°mÿüWÀÿ@ÿã-mû.ÿôB­û. np °hÿôg"HhÿöHzfHnÿüHnÿð(ÿê/.ÿäNºÁ°`" nHhÿöHzFHnÿüHnÿð(ÿê/.ÿäNºÁŒ nJ(ÿêf"hÿì#nÿü"hÿì#nÿð$`|J.ÿãgtJ-ûg ?<^N¹. n"hÿì .ÿð°©$VÀ".ÿô²­û.VÁ‚g?<«N¹.`2U� n"hÿì/)/.ÿü<ÿ<ÿN¹gDJN¹HnÿÐN¹Jf:?<N¹.Hnÿ¼Hnÿ²HnÿöHzTN¹Hnÿ²Hm÷¶N¹Hnÿ¼N¹8¢p°mÿüVÀÿ@ÿÛJ.ÿÛfN¹3”J.ÿÛgüžp°mÿüf N¹3”` ?<N¹.-nÿêÿîB®ÿòHnÿÐHnÿÆHnÿöHzÜN¹HnÿÆHm÷¶N¹HnÿÐHnÿâNºî^J®ÿêgê-nÿêÿÖ nÿÖ!nÿâ p°h$fNp°mú&f&J-û)gvf ?<«N¹. nJ(ÿêg+nÿôû. np °hÿôffp°mÿüfFN¹3”Jmÿüf /:PHnÿüN¹X¸J®ÿügê nÿü-h ÿø .ÿø°­úhf?<ÝN¹.`RJ®ÿøgJ/< nÿøHh N¹Jg ?<ïN¹. n"hÿì .ÿø°© VÀÀ(ÿêg ?<«N¹. n"hÿì#nÿø J®ÿøg("nÿøp°in-múXÿøJ-ûg-nÿòÿà nÿàHPHmÿ¨N¹d nÿà+P÷ÈB¨ B¨1|HhHmúN¹N¹3”p(°mÿüWÀr ²mÿúWÁÂg N¹3”` ?<N¹.HnÿÚHnÿöHzÜN¹HnÿÚHnÿîHnÿèN¹@|J®ÿîgJ-ûg$ .ÿî°­úXWÀ-ûAÀg ?<^N¹. nÿî0(HÀ/Hz†N¹JgÌ-nÿêÿàJ-ûg nÿàp°Pg ?<^N¹."PEúšpR@³ fdS@fö .ÿâ°­údg?<¸N¹.`B .ÿî°®ÿêf nÿÖ-hÿî` nÿÖ"nÿò#h-nÿòÿêJ-ûf /-ú4N¹\P`¦J-û*gz nÿÖ"PEúpR@³ fdS@fö .ÿâ°­údg?<¸N¹.`B .ÿî°®ÿêf nÿÖ-hÿî` nÿÖ"nÿò#h-nÿòÿêJ-ûf /-ú8N¹\P`&Y�Hmû./.ÿâB' nÿàp°PfœB(J. f ?<°N¹.J-÷Âg +nÿäø>`D nÿàJ(f"J.f/.ÿîHnÿèN¹¼þ nÿà|ÿJ-ûf nÿà+hÿòB¨/.ÿòN¹\P nÿò!nÿî nÿòL®ÿèH¨p°mÿüf\N¹3”0-ÿüHÀ/HnÿÚHnÿöHz\N¹HnÿÚN¹J?<N¹Df nÿÖ!_-nÿêÿò` Y�Hmû./.ÿâB'?<N¹Df nÿÖ!_ nÿÖJ¨fjJ®ÿâgZJ®ÿîVÀ/<"nÿâHi -@ÿÒN¹ .ÿÒÀg20-ú&Áü nÿêCíÒüøH!q0-ú&ÁüAíÐüøH!®ÿîB®ÿê` nÿÖ-hÿê`þ ­ÿÿ€û.l ?<«N¹.p°mÿüf\N¹3”0-ÿüHÀ/HnÿÐHnÿöHz‚N¹HnÿÐf(?<N¹.HnÿÐHnÿöHz4N¹HnÿÐN¹8¢` ?<N¹.`ý®N^ _PONЀ€€ NAÿÚ n0Cîÿö2À2ØU@bÿúN¹3”Jmÿüg(?<N¹.HnÿäHnÿöHzHN¹HnÿäN¹8¢;mú&úJmÿüfHnÿò/<N¹-nÿòÿê nÿêHPHmÿ¨N¹d nÿêB¨ BhHhHmúN¹ nÿê+Pú N¹N¹Jf(?<N¹.HnÿÆHnÿöHzZN¹HnÿÆN¹8¢` ?<N¹.JmÿüVÀ2-ÿüHÁ/Hm÷¶-@ÿÖN¹ .ÿÖÿAÂgùžN^.ŸNu€€`p`€`€LISTINGKEYBOARDNAÿØJmÿüf†0-ú&ÁüAíÐüøBAð-HÿÞ nÿÞp°hfX-hÿè nÿè/( nHhÿìN¹W nÿè-h3”p(°mÿüWÀr ²mÿúWÁÂg N¹3”` ?<N¹./.ÿòN¹\PHnÿäHnÿöHz¨N¹HnÿäHnÿîNºòÖ nÿò!nÿî p°mÿüf\N¹3”0-ÿüHÀ/HnÿäHnÿöHz`N¹HnÿäN¹Jf(?<N¹.HnÿÚHnÿöHz8N¹HnÿÚN¹8¢` ?<N¹.`þÞ;|ÿÿúN^.ŸNu€€€NAÿ² n0Cîÿö2À2ØÿèJ®ÿèWÀ nJ¨ÿìVÁ‚gÌJ¨ÿìf"nÿÞ/HhÿìN¹W` nÿÞ/"nHiÿìN¹W nB(ÿêJ¨ÿìg¨"hÿìJ)(gT"hÿìp°if$p°hÿôWÀ"hÿì)8AÂAÿê`$ n"hÿìp°ifp °hÿôWÀÿ@ÿê nJ(ÿêf>p°hÿôWÀ"hÿìr²iWÁÂp °hÿôWÀ"hÿìt´iWÂÄ„g ?< N¹. nU@bÿúN¹3”B®ÿêJmÿüfºHnÿæ/<,N¹-nÿæÿÖ nÿÖHPHmÿ¨N¹d nÿÖ!nÿê1|B¨ 1|$1mú(HhHmúN¹p°mú(f nÿÖ!m÷Ä ` nÿÖB¨ J-û)g nÿÖ"PEúpR@³ f S@fö`,J-û*g2 nÿÖ"PEúÔpR@³ fS@fö``p°mú&f` /.ÿæN¹\P-nÿæÿêN¹3”J(ÿêfÚp°hÿôf,Hhÿì/<=N¹ n"hÿì3|"hÿìB)8`2 nHhÿì/<=N¹ n-hÿìÿÞ"nÿÞ3|B©8B)< n-hÿìÿÞ"nÿÞHQHmÿ¨N¹d nÿÞB¨ B¨$1|B((B()múm+B(,B(*B(-B¨"n1iÿðHhHiÿÜN¹ n/(ÿìN¹\P`R n"hÿì-iÿüJ®ÿüg<-nÿüÿÞ nÿÞp°mÿüfÄ-û€-ûf ?<dN¹.N¹3”HnÿÐHnÿöHzZN¹HnÿÐHnÿâHnÿÜN¹@| .ÿâ°­úPfHnÿâHnÿÜ/<N¹d .ÿâ°­úDVÀU�/.ÿâ-@ÿÖN¹bX .ÿÖÿAÂg ?<2N¹. nÿæ1|$ nÿæL®ÿÜH¨& .ÿâ°­úDgèp°mÿüfÞN¹3”HnÿÐHnÿöHz®N¹HnÿÐHnÿâHnÿÜN¹@| .ÿâp°h$fY�Hmû./( B'?<N¹Df-_ÿì nÿü-hÿü`¾N¹3”`?<N¹. n!mø6ÿìp°mú&o†Rmú&0-ú&ÁüAíÐüøBAð-HÿÞ nJ(ÿêg:"hÿì-iÿüJ®ÿüg nÿüJ�g` nÿü-hÿü`Þ nÿÞ ®ÿü` nÿÞB� nÿÞB¨ B¨B¨1|B¨` ?<–N¹. np°hÿðf-|ÿä` ;      ?<^N¹. n"hÿì .ÿäЩ$-@ÿðY�Hnÿð/.ÿø<ÿ?<N¹Df n"hÿì#_8N¹3”`,?<N¹.HnÿØ nHhÿöHz>N¹HnÿØN¹8¢` nJ(ÿêf ?<{N¹.N^.ŸNu€0NAÿØ n0Cîÿö2À2ØU@bÿú=mÿüÿôB­úr|úûN¹3”-mû.ÿäB­û.|ûû |ûû!HnÿÜHmúN¹HmúÀÙSbú<ÿHPHmÿ¨-HøäN¹ nøä<øÿHPHz8-HøàN¹ nøà"m÷Ú0.ûèÁüz<ÿHPHq†-HøÜN¹ nøÜ<øÿHPHzb-HøØN¹ nøØHPN¹à`Âp:âr0�Ar.ùí°Agb?<cAîøèCúÜEÐÀÙSbú"m÷Ú0.ûèÁüz<ÿHPHq†-HøäN¹ nøä<øÿHPHzÐ-HøàN¹ nøàHPN¹à`L mû–0-ûšÁüHzæN¹=mú(ÿð=mú&ÿèp°mú(o Rmú(` ?<—N¹./Nºùt-nÿìÿØJ­úrVÀ nÿØÿ@(À.ÿêg ?<lN¹. nÿØJ(g !múr ` nÿØ!m÷Ä J-úmf p°mÿüf N¹3”` ?<N¹.B-ûJ-úmg&J.ÿêg?<›N¹.` nÿì|ÿ(`˜JmÿüWÀAíÿ¨CútRB± f SBför`B�ŒAèÿtAð-Hùä nùä1mÿþ 1mûž!mû  ­û¤!mø1mûœŠRmûš m÷Ú0.ûèÁüzCð†$mû–2-ûšÃüŒAò„ÀÙSbú0.ûîHÀЮújr ã lR€â€+@û HmóÆHzìN¹HmóÆ?< m÷Ú0.ûèÁüzHp†HzÒN¹HmóÆ-_ùä mÿž"nùäL�H©"#mû B­ø;|ûœB­û¤N¹ ê=møûþ;møøBmø-m÷øü+m÷ü÷ø0-ñ*HÀÂp6°mÿüWÀ‚gN¹Hnÿ®/NºòZ`J.ÿØg ?<ÊN¹. nÿ¼B("nÿ¸$nÿî%QB‘.@À-p°mÿüf N¹3”`"Hnÿâ nHhÿöHz6N¹HnÿâN¹8¢ n-hÿÞÿè"nÿèB)(|-J(ÿØg-hÿâÿè"nÿèB)(|-0-ú&ÁüAíÐüøB/0Nºì° n-hÿîÿôJ®ÿôg nÿô/(Nºì’ nÿô-hÿô`à=mú(ÿòp°mú(o Rmú(` ?<—N¹.-mû.ÿîB­û.B-û B-û!Bm÷ê0-ú&ÁüAíÐüøLB°|úlHnÿâ÷Âr²mú&WÁÂg N¹›B-÷Âp°mú&WÀ.AÀgFJ­ø>g>-mø>ÿ´ nÿ´"hJ)f/HhN¹¼þ nÿ´"h| nÿ´+h ø>`¼B'NºÍ$B'NºËèp1°mÿüfbJ.g ?<ÐN¹.N¹3”/Nºó`p°mú&VÀr²mú(WÁÂg*.ÿËgS®ÿÈ/-÷Ä/.ÿÈ/.ÿÄN¹•˜ -û.Ñ®ÿÈ`2J.f ?<ÇN¹.p °mÿüf N¹3”B.ÿß`ü(0-ÿüHÀ/HnÿÔHnÿöHzZN¹HnÿÔN¹Jf(?<N¹.HnÿÊHnÿöHz8N¹HnÿÊN¹8¢N^ _Þü NÐPì€@À@À@ÀNAÿø-nÿü nÿüp°hWÀr²hWÁ‚g B(,`2 nÿüp°hWÀ(AÂg-hÿø"nÿøp°QfB) nÿüJ¨g /( nHhÿöHz^N¹Hnÿâ n/(ÿÞN¹–Dp°mÿüVÀr²mÿüVÁÂg,?<N¹.Hnÿâ nHhÿöHz N¹HnÿâN¹8¢0-ÿüHÀ/HnÿâHm÷„HzìN¹HnÿâN¹Jgÿp n"hÿÞB)-J(ÿØg "hÿâB)-;nÿòú(+nÿîû.p°mú&f<N¹¨Ø n/(ÿî/NºùÊ0-ú&ÁüAíÐüøT-pÿøJ®ÿøgB-nÿøÿè nÿèNºÿ’ nÿüJ¨g /(Nºÿ~N^.ŸNuNAÿö n 0Cîÿö2À2ØU@bÿú|ÿúm0-ÿüHÀ/Hz@N¹Jf?<ÆN¹.HnÿöN¹8¢0-ÿüHÀ/Hz N¹Jgô0-ÿü�|ã@2;Nû&Vb¤¤°°°°°°°°°°°°°nHnÿö n(@(@À(NºÝ¶`\HnÿöNºàh`PHnÿöNºáð"PJ©VÀ"P")²®ÿü\ÁÂg"P"i$P%i`Ò nÿè-hÿø`¸+nÿüÿò=mú$ÿìN^.ŸNu@@@@@  €NAJ® g: n P P PCíÿ¨pR@± fS@fö+n ú`` n -h `ÀB­úN^ _PONÐNAþ´ n0Cîÿö2À2ØU@bÿúJ-ûg ?<^N¹.`DJ-ûf ?<dN¹.Hnÿö<ÿ<ÿ n"hÿîHi B'N¹øÖ`HnÿöNºîj`0-ÿüHÀ/HzDN¹Jf?<ÆN¹.HnÿöN¹8¢`þøB-úmN^ _PONЀ@€@@€@NAÿøJ® gR-n ÿø nÿøJ¨g /(NºýÒ n -h ÿüJ®ÿüg/.ÿü/.Nºÿ¾ nÿü-hÿü`à n -h `¨N^ _-mû.ÿÈ=mú&ÿÐHnÿÌHmúN¹múmÿÙB-úm-mø>ÿÀB­ø>HmúHzÀN¹B­û.B­úrp.°mÿüf N¹3”` ?<ËN¹.Jmÿüg"?<N¹.Aú”Cíÿ¨ÀØSbú`p°-ÿ¨d ?<±N¹.0-ú&ÁüAíÐüøBAð-Hÿ¼ nÿ¼p°hf/(/Nºþ¸`F nÿ¼/(/Nºþ¦ nÿ¼-hÿæJ­úWÀJ®ÿæVÁÂg nÿæPONÐNAÿâ=mú$ÿì0-ú&R@;@ú$-mÿòÿüp°mÿüf?<N¹. nHhÿöNºÚ²0-ÿüHÀ/Hz$N¹Jgâ0-ÿü�|ã@2;Nû8`‚ÊÊÊÊÊÊÊÊÊÊÊÊÊÊʤ„ÊÊÊÊÊʤ¤Hnÿâ nHhÿöHz˜N¹Hnÿâ<ÿB'NºÛØ`lHnÿâ nHhÿöHztN¹HnÿâNºÞt`JHnÿâ nHhÿöHzVN¹/( /Nºþ| nÿæ-hÿæ`ÔJ­úWÀú@ÿØp°mú&o>Rmú&0-ú&ÁüAíÐüøBAð-Hÿ¼ nÿ¼B�B¨B¨ B¨1|B¨` ?<–N¹.Hnÿî/<N¹J.ÿØgÆHnÿò/<$N¹HnÿÞ/<=N¹-nÿÞÿ¼ nÿ¼HPHmÿ¨N¹d nÿ¼B¨ B¨HhHz N¹ nÿ¼1|1||+B(B¨$B()B(HnÿâNºßæ`(J-ûf ?<dN¹.<NºØvB'Nº×:0-ÿü�|.ã@2;Nûªªªªªªª@v nHhÿöB'B'0-ú&ÁüCíÒüøTHqB'N¹øÖ`lN¹3” nHhÿö<ÿ<ÿ0-ú&ÁüCíÒüøTHqB'N¹øÖ`6N¹3” nHhÿö<ÿB'0-ú&ÁüCíÒüøTHqB'N¹øÖ``HJ-ûf ?<dN¹.-|(B(,B(*|81mú(-nÿòÿ¼ nÿ¼ ®ÿÞB¨|B( B¨ B¨B¨B(B¨`Z mú-Pÿò nÿò-PÿÞ-nÿòÿ¼ nÿ¼J( g ?<ÏN¹. nÿ¼0-ú&ÁüCíÒüøH#¨+h û.|û |û!p°mú(f-m÷ÄÿÄ nÿÞ+P÷ÄJ.ÿØg nÿÞ!m÷Ä -nÿîÿ¼ nÿ¼ ®ÿòB¨B¨B¨ "nÿò!i-nÿòÿ¼0-ú&N¹3” nHhÿö0-ú&ÁüCíÒüøP"q"QHi <Nºö¸``þ 0-ÿüHÀ/Hz6N¹JgŽ0-ÿü�|ã@2;Nû8XrŒŒvvvvvvvvvvvvv¼8vvvvvv¼¼?<�N¹. nHhÿö<ÿB'NºÙè` ?<�N¹. nHhÿöNºÜŒ`?<�N¹. nHhÿöNºÞ`ì<NºÖ¨B'NºÕlHnÿâÁüAíÐüøBAð-Hÿ¸ nÿ¼!nÿî"nÿ¸#nÿîJmÿüfN¹3”p°mÿüf N¹3”` ?<N¹.p°mú&WÀ.AÂgB'N¹¨Ø/-÷ÄN¹…¾B-÷Ãp/°mÿüflp°mú&WÀÀ.ÿØ.AÂg"|÷Â/-÷ÄN¹™j0-ÿþ]@;@÷ÀN¹™úN¹3” nÿ¼"nÿ¸"¨Hnÿö$nÿòHjB'Nºî nÿ¸"nÿ¼#P nÿ¸B�"nÿ¼|<     ÿüf N¹3”` ?< N¹. nÿ¸"nÿ¼#h#mû. +nÿÈû.+nÿÀø>;nÿÐú&HmúHnÿÌN¹nÿÙúmp°mú(f(+nÿÄ÷Äp°mú&WÀ.AÀg /-÷ÄN¹…¾|û J.f nÿò|ÿ nÿî"n !Q n ®ÿî-nÿîÿêJ®ÿêg¬ nÿê-h ÿæJ®ÿægŒ-nÿæÿ¼ nÿ¼-Pÿ¸J.fV"nÿ¸J) fF?<ÂEîþ¸&Q&SIÓHm÷ÔN¹Hm÷ÐN¹-÷Õ€/HztN¹0-÷Ô舀^ÀÀgBAîÿCúVEÐÀÙSbúHnþ/HzR-÷Õ€/</-HýüN¹ nýüU—/<-HýøN¹ nýø"_<ýÿHPHQ-HýôN¹ nýô<ýÿHPHzì-HýðN¹ nýðCÐAí÷îÀÙSbú0-÷Ô舀r ²€l$0-÷Ô舀//< N¹GÒÀÜSbú<þÿHRHz-Jþ´N¹$nþ´HRN¹à nÿ¸|ÿ `J.f nÿ¸|ÿ nÿ¼-hÿæ`ÿp nÿê-hÿê`ÿPJ.gPp°mÿüf.N¹3”0-ÿüHÀ/HzvN¹Jf ?<ËN¹.`p°mÿüg ?<N¹.` p°mÿüf N¹3”` ?<N¹.+nÿîú nÿò+P÷ÖN^ _ÞüNÐ@@p0П@÷ï0-÷Ô舀//< N¹p0П@÷ð-÷Ô∀//< N¹/< N¹p0П@÷ö-÷Ô∀//< N¹p0П@÷÷`Aú"Cí÷îÀØSbúN^.ŸNuø -- $JanFebMarAprMayJunJulAugSepOctNovDecNAÿøHmúD/<N¹-múDÿü nÿüB(B( ¼**undefmodule**: needs concrete instanceNAþê n0Cîÿö2À2ØU@bÿúp°mÿüf HnÿöNºË’p°mú(f /-÷ÄN¹…¾J-ûgˆp°mÿüfHnÿö<ÿB'NºÍ p°mÿüf HnÿöNºÏ¶p°mÿüf HnÿöNºÑ8p°mÿüWÀr ²mÿüWÁ‚g<NºÉÈHnÿöNºÝÎ`Ø0-ÿüHÀ/HzÚN¹Jg ?<^N¹1|BhBhHh HmúN¹HmúH/<N¹-múHÿü nÿü|ÿB( ¼1|1|| BhBhHh HmúN¹HmúL/<N¹-múLÿü nÿüB(B( ¼1|1|Hh HmúN¹HmúP/<N¹-múPÿü nÿü|ÿB(1|B( ¼1|BhBhHh HmúN¹.0-ÿüHÀ/Hz¾N¹Jg°0-ÿü�|ã@2;Nû8JV˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜b:˜˜˜˜˜˜bbHnÿö<ÿB'NºÌ,`PHnÿöNºÎÞ`DHnÿöNºÐf`8<NºÉp°mú(f0-ú&ÁüAíÐüøB/0Nºìà0-ÿü�|.ã@2;Nû˜˜˜˜˜˜˜:jHnÿöB'B'0-ú&ÁüAíÐüøTHpB'NºõØHmúT/< N¹-múTÿü nÿü|ÿB(1|B( ¼1|Bh1|Hh HmúN¹Hmú`/<N¹-mú`ÿü nÿüB(B( ¼–1|1| B¨Hh HmúN¹HmúX/<N¹-múXÿü nÿüB(B( ¼1|1|B¨Hh HmúN¹Hmú\/<N¹ múX"mú\LÐ?HÑ?3h``N¹3”Hnÿö<ÿ<ÿ0-ú&ÁüAíÐüøTHpB'Nºõ¨`0N¹3”Hnÿö<ÿB'0-ú&ÁüAíÐüøTHpB'Nºõz```p°mú(VÀ-ûAÂg?<dN¹.`J-ûg ?<^N¹.N¹3”Hnÿö0-ú&ÁüAíÐüøPHpB'Nºç(``þ<0-ÿüHÀ/HzN¹JgN0-ÿü�|ã@2;Nû8Tj€€66$$Hmúd/<N¹-múdÿü nÿüB(B( ¼—1|1| !múPHh HnÿøHmúHz€N¹HnÿøN¹Hmúh/<&N¹-múhÿü nÿüB(B( ¼1|1|!múP!múD|ú1| |"1|ÿ$Hh HzN¹N^.ŸNu`NAÿìHnÿø/<N¹-nÿøÿð nÿðHPHzN¹d nÿð66666666666Æ”666666ÆÆ?<�N¹.Hnÿö<ÿB'NºÊ\`ä?<�N¹.HnÿöNºÍ`Î?<�N¹.HnÿöNºÎ‚`¸<NºÇ$HnÿöNºÛ*`¤?<�N¹.N¹3”Hnÿö0-ú&ÁüAíÐüøPHpB'Nºæ4`r<NºÆÞ?<�N¹.p.°mÿüf(HnÿöB'B'0-ú&ÁüAíÐüøTHpB'Nºóâ`,N¹3”!múL BhHhHmúN¹/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHzN¹d nÿð!múL BhHhHnÿìHmúHz’N¹HnÿìN¹/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHz®N¹d nÿð!múD BhHhHmúN¹/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHz*N¹d nÿð!múP BhHnÿö<ÿB'0-ú&ÁüAíÐüøTHpB'Nºó´``þž<þNºÆjp°mÿüg?<N¹.HnÿöN¹8¢B-û B-û!Bm÷ê0-ú&ÁüAíÐüøB/0NºÝº0-ú&ÁüAíÐüøT-pÿîJ®ÿîgh nÿî PJ( fN?<ÂAîþî"nÿî"Q"Q"QEÑCÐÀÚSbú<ÿÿHPHz-HþêN¹ nþêHPN¹à nÿî P|ÿ nÿî-hÿî`’|úlHhHmúN¹/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHzN¹d nÿð!múT BhHhHmúN¹/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHzªN¹d nÿð!múh BhHhHnÿìHmúHzTN¹HnÿìN¹/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHz:N¹d nÿð!múd BhHhHmúN¹p°mÿüfN¹3”HnÿäHnÿöHz¤N¹Hnÿä/.N¹–D0-ÿü°n g:?<N¹.HnÿäHnÿöHnÿÚHzh0. HÀ/N¹N¹HnÿäN¹8¢0-ÿü°n WÀ2-ÿüHÁ/Hm÷„-@ÿêN¹ .ÿê€gÿdp°mú(f <N¹¨ØN^ _Þü NЀ: needs concrete instanceNuNAýð/.ÿøN¹\PHnÿø/< N¹-nÿøÿð nÿðHPHzN¹d nÿð!múD 1|HhHmúN¹ nÿðCè-Iÿì"nÿì¼ÿ#|ÿÿÿ/.ÿøN¹\PHnÿø/< N¹-nÿøÿð nÿðHPHz¦N¹d nÿð!múD 1|HhHnÿìHmúHzBN¹HnÿìN¹ nÿðCè-Iÿì"nÿì¼ÿ#|€/.ÿøN¹\PB®ÿü-|ÿÿÿÿÿô<     N¹d nHhÿtHzN¹d nHhÿdHzÎN¹d nHhÿˆHzÂN¹d nHhÿŒHz&N¹d nHhÿ”HzÄN¹d nHhÿxHz N¹d nHhÿ|HzN¹d nHhÿ„HzîN¹d nHhÿ€HzþN¹d nHhÿàHzÒN¹d nHhÿ�HzðN¹d nHhÿ˜HzäN¹d nHhÿœHzÀN¹d nHhÿ Hz*N¹ nHhÿ˜HzúN¹d nHhÿœHzÔN¹d nHhÿ HzîN¹d nHhÿ¤HzúN¹d nHhÿˆHz¶N¹d nHhÿŒHz¨N¹d nHhÿÈHzÌN¹d nHhÿØHzÂN¹d nHhÿÜHzN¹d nHhÿÀHzÖN¹d nHhÿÄHzÎN¹d nHhÿÐHzÚN¹d nHhÿÌHzÒN¹dN^.ŸNuLNPOSSTRSINd nHhÿ¤Hz€N¹d nHhÿ´Hz¢N¹d nHhÿ¸Hz\N¹d nHhÿÄHz„N¹d nHhÿ4HzØN¹d nHhÿ8HzÎN¹d nHhÿØHzbN¹d nHhÿ¼HzBN¹d nHhÿÀHz N¹d nHhÿÈHzN¹d nHhÿÌHz$N¹d nHhÿÐHzN¹d nHhÿÔHzN¹d nHhÿ0HzNN¹d nCOSEXPGETPUTCOPYMARKSQRTINSERTDELETEESCAPEARCTANSTRRPTSTRPOSRELEASEMEMAVAILUNITBUSYUNITWAITNEWWORDSSTRLTRIMSTRRTRIM UNITCLEAR STRAPPEND STRINSERT STRDELETE ESCAPECODENAÿp/NºýHnÿô/<&N¹ múh"nÿôLÐ?HÑ?3h$$ nÿôR®ÿôHnÿø/< N¹-nÿøÿð nÿð!múT J®ÿôfHPHzöN¹d` nÿðHPHzÜN¹d nÿð!nÿü1|Cè-Iÿì"nÿì¼ÿ#nÿôHhHmúN¹/.ÿøN¹\P-nÿøÿü ®ÿômÿf múT!nÿøHnÿø/< N¹-nÿøÿð nÿðHPHzFN¹d nÿð!múX B¨1|Cè-Iÿì"nÿì¼ÿB©HhHmúN¹HhÿÜHzDN¹d nHhÿäHz¢N¹d nHhÿèHzÌN¹d nHhÿìHz”N¹d nHhÿðHzN¹d nHhÿôHzdN¹dN^.ŸNuABSCHRODDORDSQRHEXNEWEOFPREDSUCCADDRCALLPAGEREADOPENSEEKEOLNHALTPACKSCANROUNDTRUNCOCTALWRITECLOSERESETBIN/.ÿøN¹\PHnÿø/<N¹-nÿøÿð nÿðHPHzN¹d nÿð!múX B¨BhHhHnÿìHmúHz°N¹HnÿìN¹/.ÿøN¹\PHmú0/<,N¹-mú0ÿð nÿðHPHzÚN¹d nÿð!múD B¨1|HhHnÿìHmúHzPN¹HnÿìN¹ nÿð!mû6 1|!|ÿÿÿê1|$/-ú0N¹\PN^.ŸNuARYSIZEOFPROMPTREADLNAPPENDMAXPOSSTRLENSTRMAXUNPACKLENGTHCONCATGOTOXYDISPOSEWRITELNREWRITEREADDIRSTRREADSTRMOVELINEPOSWRITEDIRSTRWRITEPOSITIONUNITREADMOVELEFTFILLCHAR OVERPRINT SETSTRLEN UNITWRITE BLOCKREAD MOVERIGNILREALCHARTEXTTRUEFALSESTRINGMAXINTMININTANYPTRINTEGERBOOLEANLONGREALIORESULTNAÿøHnÿüHzÜN¹dHmø&/<N¹-mø&ÿø nÿø ®ÿüB¨ BhHhHmúN¹Hmø*/< N¹-mø*ÿø nÿø ®ÿüB¨ B¨1||B¨HhHmúN¹Hmø.HT BLOCKWRITENAÿ /NºúL=|ÿÿÿúRnÿú0.ÿúHÀ/Hz0N¹_ÿùJ.ÿùgHnÿü/<N¹`Hnÿü/<N¹-nÿüÿ0.ÿúHÀå€ nÿCîÿ ±B¨p2°nÿúg B¨ `H nÿHh /<&N¹ nÿ"múh$h LÑ?HÒ?5i$$ nÿ"h 3|ÿ$"h "¼J.ÿùg nÿ1|` nÿ1| nÿ/<&N¹-mø.ÿø nÿø ®ÿüB¨ B¨1|B¨ BhB¨1|$HhHmúN¹Hmø2/< N¹-mø2ÿø nÿø ®ÿüB¨ B¨B¨B(1|HhHmúN¹Hmø6/<=N¹-mø6ÿø nÿø ®ÿüB¨ B((B()B¨B¨$BhB(-1|B(8B(+1|HhHmúN¹ nÿøB(*Hmø:/<=N¹-m1|1nÿú0.ÿúHÀ/HzRN¹Jg* nÿHhHnÿ HmúHz N¹Hnÿ N¹`Ô0.ÿúHÀ/HzòN¹Jg* nÿHhHnÿ HmúHzÎN¹Hnÿ N¹`”0.ÿúHÀ/Hz¾N¹Jg* nÿHhHnÿ HmúHz‚N¹Hnÿ N¹`T0.ÿúHÀ/HzxN¹Jg* nÿHhHnÿ HmúHzFN¹Hnø:ÿø nÿø ®ÿüB¨ B((B()B¨B¨$Bh1|B¨81|HhHmúN¹ nÿøB(+B(*B(-N^.ŸNu*undecl*NA nHhÿHzþN¹d nHhÿHzðN¹d nHhÿ HzâN¹d nHhÿ$HzÔN¹d nHhÿ(HzN¹d nHhÿ,HzN¹d nHhÿHz¢N¹d nHhÿN¹d nHhÿTHzN¹d nHhÿXHz.N¹d nHhÿ\Hz„N¹d nHhÿ`HzN¹d nHhÿ¨HzN¹d nHhÿ°HzN¹d nHhÿ¬HzDN¹d nHhÿhHzN¹d nHhÿlHzxN¹d nHhÿpHz°d nHhÿ´HzN¹d nHhÿ°Hz N¹d nHhÿ¸HzÞN¹d nHhÿÔHz´N¹d nHhÿàHz@N¹d nHhÿäHzüN¹d nHhÿèHzôN¹d nHhÿ€Hz¦N¹d nHhÿ„Hz N¹d nHhÿ¬HzÈN¹d nHhÿxHzTN¹d nHhÿ|Hz~N¹d nHhÿ�HzN¹d nHhÿ”HzN¹d=     1|ÿ$ nÿô ¼=|8ÿîRnÿî0.ÿîHÀ/HzN¹_ÿíJ.ÿígHnÿø/<N¹`Hnÿø/<N¹B®ÿðB®ÿü0.ÿî�|9ã@2;Nû:Lˆš¼¼¤¤¤¤¤¤šÎî–Jêêpî–JÊv^v/-úX?</Nºû¸`´/-úX?</Nºû¦`¢-múTÿð/-úD?</NºûŽ`Š/-úD?</Nºû|`x/-0-÷Ðꈀ?/?<N¹<:?<ÿÿN¹ -÷Ðàˆ€ÿ//<dN¹ =@ÿþp °nÿþo<Hmú®Hnÿú<ÿ0?<ÿÿN¹<Hmú®Hnÿú?.ÿþ?<N¹/-ÿ¦/Hz0?<?<ÿÿN¹/Hz"?<?<ÿÿN¹/Hz?<?<ÿÿN¹/< ?<ÿÿN¹/9€/?<N¹/</?<ÿÿN¹/úH?</Nºûj`f-múDÿð`\-múLÿð/-úL?</NºûH`D/-ú`?</Nºû6`2/-úD?</Nºû$/-úX?</Nºû`/-úD?</Nºû/-úD?</Nºúö/-úh?</Nºúè`ä/-úD?</NºúÖ/-úh?</NºúÈ/.ÿô?</Nºúº`¶-múDÿð/.ÿô?</Nºú¢/.ÿô?</Nºú”`�-nÿôÿð/-úD?</Nºú|/.ÿô?<09舀/?<N¹/</?<ÿÿN¹/9∀/?<N¹/<]?<ÿÿN¹/Hm÷î?< N¹/< ?<ÿÿN¹/Hmú®?<ÿÿN¹N¹/-ÿ¦N¹/-ÿ¦/HzN?<.?<ÿÿN¹N¹/-ÿ¦/Hzø?<?<N¹/Hz?<?<ÿÿN¹N¹/-ÿ¦N¹N¹>ÖN¹˜�/Nº/Nºún`j-nÿôÿð/-úD?</NºúV/-úD?</NºúH/.ÿô?</Nºú:`6/.ÿô?</Nºú(/-úh?</Nºú`-nÿôÿð/.ÿô?</Nºú-nÿøÿt0.ÿîHÀå€ nÿtCîþ” ±!nÿð !nÿüJ.ÿíg 1|` nÿt1| nÿtBh1nÿî0.ÿîHÀ/HzZN¹Jg* nÿtHhHnÿpHmúHz.N¹HnÿpN¹ú^/NºûÎ/NºüÔBmú(Bmú&Bm÷êBmú*Bm÷ì;|øFB­øBB­øHB­øLB­øPB­øTHmúHznN¹/Nºß†/NºèN¹3”/Nºâr/Nºïª/Nºõ`;|ú(;|ú&;|ø\B­øXB­ø^B­øbB­øfB­øj;|ú$N¹ö¼Jm÷äf2Hm÷Ú/<ÄN¹;| ÷ä;|÷æAíþô$m÷ÚCÒÀØSbúJm÷âfHm÷Þ/<�N¹;| ÷âBm÷èB-û&B®`ø0.ÿîHÀ/Hz@N¹Jg* nÿtHhHnÿpHmúHzòN¹HnÿpN¹`¸0.ÿîHÀ/HzäN¹Jg* nÿtHhHnÿpHmúHz¦N¹HnÿpN¹`xpE°nÿîf* nÿtHhHnÿpHmúHz„N¹HnÿpN¹`FpF°nÿîf* nÿtHhHnÿpHmúHzFN¹HnÿpN¹` nÿtHhHmúN¹/.ÿøN¹ÿúR®ÿú/-ÿ¦N¹ ®ÿúmè/-ÿ¦Hz¨?<?<ÿÿN¹Hmø/<=N¹-møÿö nÿöB¨B¨$HPHzzN¹d nÿöB¨ 1|1|BhB(8B((B()B(-B(B¨ HhHzN¹HmúHz N¹N^Nu€3.25MPascal [Rev < 0>PROGRAMAll rights reserved.Copyright Hewlett-Pa\P nUÿîmü N^.ŸNu `à ü|È àNAB-ûBmúvAúNCíú¸ÀØSbúB­øB­ø|øûB-û‹B-úlB-úmB­ø"B-ûB­û.|ûû +|úœ+| ú AúCíúxÀØSbúAúîCíúŠÀØSbú|úû!B-÷ÂB­÷üB­øB­ø|øûB-ûB-ûckard Company, 1982, 1991.NAÿÚ n J�fD+mú,ÿò n hB(ÿäHhÿæ/<N¹ nHhþô"h/)ÿæ/<N¹`J n PLÐHîÿÚ=h$ÿþHnÿÚ/.Nºÿ�/. /<&N¹HnÿÚ n //<&N¹N^ _PONÐNAþð nHhÿö/. N¹/@-mú,þð nþðJ¨g€JPg?<2N¹. nB¨ÿò`|ûû|ûûB-û|ûû|ûû|ûûB-ûB-ûB-û|ûû#;|û B-û|ûû+Bm÷äBm÷â|÷û&B-û"B-û(BmøAúfCíû:ÀØSbúAíû:+Hû6AúBCíú¤ÀØSbúB-û,B-û-B-û)B-û*;|ÿÿúB-ûBmöèB-û$B-ûB-û N^.ŸNuFLTPTHDW SYSGLOBALSNAÿìHm÷fHzÂN¹Hm÷pHz¼N¹Hm÷¶Hz¾N¹d nþðp,°h fV"n#hÿòJ-úlgL¨H©ÿä`4 nþð"hHQHnþô/< N¹Hnÿ/NºþÈ n"hÿæ#nÿN^ _PONÐNA n hHhÿ¼/< N¹ n h"hÿ¼$hL’H© n h"hÿÄJ©f"hÿÄ#hÿ¼` n h"hÿÀ"¨ÿ¼ n h"hÿ¼B‘!hÿ¼ÿÀN^.ŸNuNAþÐ n h"hHm÷zHnÿöHnÿìHz Hm÷¶N¹HnÿìHm÷pN¹HnÿöN¹Hm÷„Hz�N¹Hm÷ŽHnÿöHm÷„HzpN¹HnÿöN¹Hm÷˜Hz*N¹Hm÷¢Hz"N¹Hm÷¬HzPN¹N^.ŸNu`ˆ<ˆ=ˆ9@ \À€à€NAÿü+|öêB®ÿüR®ÿü .ÿüS€å€Aí"iHQHnþô/< N¹ n+hÿîÿòJ. g/Nºÿ@ n h-hÿÀþÜJ. g*"nþÜHi/< N¹ nþÜ"h2¼"hB© nþÜ-hþØ"nþØ <þ�© -@þàJ®þàlB®þàp°nþôf/.0.þþHÀ/N¹-_þä`/./.þþN¹-_þä .þä°®þàoHnþð .þä�®þà/N¹p-nþÔ°®þÔn¤-@þèÐüöê 0ã€".ÿüå�AíÐüöê!€ ®ÿümÊN^.ŸNuNAÿö/NºàÆ müœB( |ú®-|ÿú-÷Ðæˆ€r ²€o<Hmú®Hnÿú<ÿ0?<ÿÿN¹<Hmú®Hnÿú?/////-÷Ðæˆ€/?<N¹<:?<ÿÿN¹0-÷Ðꈀ?r ²€o<Hmú®Hnÿú<ÿ0?<ÿÿN¹<Hmú®Hnÿú?/////p°nþôf@p2.þþHÁ-Aþа®þÐn(-@þì nþØR¨ .þì"( Cîþÿ± .þìR€hÒ`Np°nþôfDp-nþþþа®þÐn4-@þì nþØR¨ "n"i$i$j .þì"( ²  .þìR€hÆ .þèR€hÿXN^ _Þü NÐNA n h h h"n L¨H‘N^ _PONÐNA n "n )°¨l |`Z n "n=     J¨ÿòVÀ"h)ÿ»AÂgÜB®ÿü/. /NºÿVJ®ÿüf?<¢N¹. n h|ÿ»`ª n"hÿòJ‘f."hÿò"i J©g?<¢N¹. n h|ÿ»`p-nÿüÿô n"hÿò-i ÿø"hÿò!Qÿò"nÿôJ©f$nÿø/*/Nºþ6`6 nÿô"hJ)g"nÿø/)/.Nºþ nÿô"h/)/.NºÿN^ _PONÐNAþæ n|ÿ»p°mÿüf N¹3”`?< N¹. n|ÿ»`ˆN¹3”B.ÿöJmÿügX?<N¹. n|ÿ»HnÿàHnÿÖHhÿöHz®N¹HnÿÖHzˆN¹HnÿàN¹8¢p°mÿüf|ÿö`¦ n"hÿò/)HhÿîN¹W nJ¨ÿîf?<hN¹. n|ÿ»`/NºòVp°mÿüf N¹3”`Rp°mÿüfN¹ n"hÿò=iÿþ0.ÿþHÀ/HzìN¹JgÒp°nÿþg´ nHhÿà/<N¹J­÷Ägb n"hÿàHiCîþî$m÷ÄGÒEÑÀÛSbú<÷ÿHQHz®-IþêN¹"nþê m÷È<÷ÿHQHP-IþæN¹"nþæHQN¹d` n"hÿà#m÷È nHhÿÄ/<N¹ n"hÿÄ"¨ÿò"hÿÄB© n-hÿòÿê"nÿê0)]@ã@2;Nû3”|ÿö`8?<N¹. n|ÿ»HnÿàHhÿöHzôN¹HnÿàN¹8¢|ÿöJ.ÿögþø nJ(ÿ»fR"hÿÄ-iÿò"nÿêJ©f/)/Nºõz`. nÿê"hJ)g /(/Nºõ\ nÿê"h/)/NºöT` n/(ÿò/Nºí`p°nÿþg2 nB(ÿä!hÿàÿæ"hÿà2¼"hÿà#hÿÄ"hÿÄ!Qÿò"hÿàB)N^.ŸNu@ )°¨o B.`> n"n (À)g n "n0) °h ]À@` n hN^ _Þü NÐNAÿø n h h"hÿÄ-iÿøJ®ÿøf"hÿÄ#hÿ¼`žU� n /( nÿø/( /Nºÿ4Jg$ n h h"hÿÄ#n "n "®ÿø`^-nÿøÿü nÿø-PÿøJ®ÿøg8U� n /( nÿø/( /NºþÞJg ª¼ ¼6N¹3” nÿê (°­úPWÀÀ(g‚|ÿøU�"n/)ÿòN¹b¦Jg|ÿù n"hÿò0)$HÀ!@ÿÔ`FB.ÿù nÿêJ¨g./("nHiÿÈHiÿÌN¹jÐ n (ÿÌ�¨ÿÈR€!@ÿÔ` nB¨ÿÔ`FB.ÿø nÿêJ¨g./("nHiÿÈHiÿÌN¹jÐ n (ÿÌ�¨ÿÈR€!@ÿÔ` nB¨ÿÔ|ÿÿ÷ nB¨ÿØ-mÿòÿîHn``-nÿøÿü nÿø-Pÿø` nÿü ® n ®ÿøN^ _PONÐNAÿö n hHhÿ¼/<N¹ n h"hÿ¼#hÿî "hÿ¼B‘N¹3”p°mÿüf N¹3”`?<N¹. n h|ÿ»Hnÿö n hHhÿöHz     @  @€@€€€@€_NAþì-mú,þì nþì"nL¨H©ÿä#hÿòJ-úlf‚J)ÿäf$hAÒHPHnþô/< N¹ n+hÿ¶ÿòJ(ÿäfP0.þôm2°|n*ã@2;NûHhÿæ/<N¹-|þð`Hnþô n/(ÿæ/.þðN¹N^.ŸNuNAÿü n!mÿòÿ¶HhÿöN¹^ê-mú,ÿü nÿüJ¨N¹…˜N¹l.N¹WN¹CÈN¹N¹N¹N¹N¹N¹N¹N¹N¹N¹+mÿòúnN¹&./-ÿö/Hzœ+OÿöHmú     È-È -Ð=ÐÈ-ÐÕÈ-Ð1È-ˆˆˆˆˆˆˆˆˆÐEȸ-Ð1È-Ð MˆPˆÐMÐ1ˆ.ˆÈ-Ð1È-Ð=Ð!Ð=ÐMˆPˆÐ=Ð!Ð=ÐMÐ1ˆRÐ(õÈ-È -Ð1È-Ð=ÐMÐ=ÐÈ-ÐÕÈ-Ð1È-ˆÐYˆÐmÈ-ˆÐ*}ÐmÐ(}ˆÈ-È0-Ðáˆ.È6-ˆ`ˆˆ ˆˆˆˆˆ ˆˆˆˆPˆˆ ˆˆˆˆˆˆˆPˆJÐ áˆÐYÈ-È -ˆÈ-È-È-ˆ ˆ ˆˆˆˆˆˆˆˆˆ ˆˆˆˆÐ1ˆ Ð=Ð1ˆ Ð1ˆ ˆˆÐ!ˆˆÐ=ˆ Ð=ˆˆÐ=ˆÐ!Ð=ˆ Ð=Ð=ˆˆˆÐ!ˆˆÐ=ˆ Ð=ˆ Ð=Ð=ˆÐ1ˆˆˆˆÐ=Ð=Ð1ˆÐ­È-Ð1Ȉˆˆˆˆˆˆˆˆˆˆˆˆ ˆˆˆ ˆˆˆˆÐ‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÐለPÐÅÈ-È-ˆ Ðeˆ ˆÐÈ-È-ˆˆ ˆˆ ˆÈ-ˆˆˆˆÈ-ˆ ˆˆ ˆ ˆˆˆˆˆ ˆˆˆˆˆˆ ˆ ˆÐ­ˆˆÐ=Ð=Ð=ÐPÐ!ÐPÐ!ÐPÐ!Ð=ˆÐMˆ ЈÐMЈÐ-Ð=Ð1È-Ð=ˆÐMÐ=ˆÐ!Ð1È-Ð1ˆˆÈ-ˆÐ!Ð=ˆÈ-Ð=È -ˆÐ!ˆÈ-Ð=È -Ð=ˆÈ-Ð=È -ˆÐ!ˆÈ-Ð=Ð1È -Ð=Ð1ˆˆˆÈ-Ð=Ð1ˆÈ-Ð=Ð1Ð̵ÐL•ˆBÐ !ÈéÈ éˆ È-Ð=È-ˆ ÐñÐåˆ Ð‘ˆÐõÈ-È -ˆˆˆÐ õELSEO ENDON¤O‚ EXPORTO&0EXTERNALO<O.OZ7FILEOTOl-FOROhFORWARDOzOFOÀ6FUNCTIONO�O® GOTOO¨IFO¼OšOØ IMPLEMENTOÎOî1IMPORTOæ/INMÐ=ˆÐ•Ð1ˆÐ1ˆ ˆ6È-Ð1ˆ,ˆ ˆÐ=Ð1Ð&õˆ$ˆˆ ˆˆ0ˆˆÐ!Јˆ ÐÐ=ˆ ˆˆÐˆÐ!ˆˆÐ •Ј ÐÐ=ˆˆÐ •Ј ÐÐ=ˆˆÐ •ЈˆˆˆÐõˆ(Ð ÐõˆÐ=Ð1ˆˆˆÐTõˆ Ј Ð=Ð1ˆ Ð=ˆÐMЈÐ!Ð=ˆÐ•ˆˆÐ=OüOPä(LABELPMODP"PP<&MODULEP4PN.NOTPJ%OFP\P&P  ORPnPŠ' OTHERWISEP€2PACKEDP˜PrP¸* PROCEDUREP®PÎPROGRAMPÆ!RECORDPÜP`QZ,RECOVERPòˆ ЕˆˆÐ=ˆÐ!ЈÐ1ˆˆ Ð1ˆˆˆÈ-ˆ ˆˆˆÉf-È -Ð )È-È-È-ÐL1È¢-È -ˆÈ-È-È-ˆ ˆ ˆˆˆˆˆˆРሠÈ-Ð ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ ˆˆˆÈ-ˆ ˆˆˆˆˆ ÐለРÅÈ -ˆ ÐeÈ-ˆ ˆÐÈ-È -ˆ ˆˆˆˆˆˆˆˆˆˆˆQ9REPEATQSETQPúQ6)THENQ0QH TOQDTRYQVQ"Q”8TYPEQhQ‚UNTILQ| VARQ�QnQ¨WHILEQ¢Q¼WITHQ¶LßBDgp, `(E Tg2´b.eJ$F¸be4>UGmµVÏÿüf&Œˆˆˆ ˆˆˆˆˆˆˆˆ ˆˆ P$ˆPˆˆˆ<ˆˆˆ ÐDõPˆˆPˆˆˆ ˆˆˆ ˆ ˆ Ð áPˆ*P P0ˆˆ0ˆ PˆÐ ‘ˆˆˆˆˆˆˆˆˆˆˆ$ˆˆ ˆˆˆˆˆˆˆˆˆˆˆ È-ˆ ˆ"ˆˆˆˆPˆˆˆˆ(ˆˆÐŒ}ˆXˆˆ ˆˆˆÐáPPˆˆpˆˆˆˆˆˆˆˆ ˆˆˆˆˆ ˆˆˆˆˆˆˆˆ ˆˆˆˆˆB—NÑBGUGmµVÏÿüe*,fÀ&Œ.¼NÑ>UGmµVÏÿübâ*,f¢&Œ.¼ÿÿÿÿNÑ(E TJg´*,fò`æÎìÿkÔ$ÿ΄‚ŠÿREALÿ‚úÿlt*ÿƒ>gGŽHÿ COMPIO_ERRORÜ.”ÿ{Ú.À.Îÿø áh @COMPIO_INSYMBOL æ ÐP$ˆ ˆˆˆˆˆˆ ˆˆÐ‘ˆÐYÈ-È-Ð"qˆÐ&}Ð}ˆÐmÈ-ˆ ˆˆ ˆ ˆ"ˆˆˆˆˆˆˆ ˆˆˆ ˆˆÐ !ˆˆ ˆ,ˆˆ ˆ ˆˆ"ˆP ˆ Pˆˆ>ˆ ˆˆˆÐ !ˆˆ ˆˆˆˆ ˆˆˆˆˆˆˆˆˆˆˆ>ˆˆˆˆÐ!ˆÈ-ˆˆˆˆ ˆˆÐ!ˆˆ Ð"‘ˆˆˆˆ ˆˆ"ˆP ˆ PˆÈ-ˆˆˆˆˆˆˆÿ„,ÿÿ áhÿ„tÿšT COMPIO_ERRORp€€€žÿƒŠÿ„ÿ„tá¶ÿkÔ$ÿÐRÿòA½Gÿƒ¨ÿƒÒÿÎìÿlt$ÿ΄øN¹EXTuENUMÿ„0ÿkÔ*ÿ„tÿ @„N¹NMOHDDREÿˆˆˆˆˆˆˆˆˆˆPˆˆ†ˆˆˆˆˆˆˆˆˆˆPˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÐሠˆˆˆˆÐáÈ -È -ˆˆÐÈ"-È-È-ˆˆ6ˆÐለˆˆˆˆˆ ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ ˆÐ1Ð&õˆˆˆ:ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÐለˆˆÐ‰ ˆÐ…È -È-Ð…È -È-ˆˆÈ-Ð1ˆˆˆˆˆÐ ‰ˆˆˆˆˆÐ õˆˆ@È.-Ð1È -ÐÈ-Ð=Ð1È-Ð=ˆÐ !Ð=ЕÐ1ÐmÈ-ÐyÐйÐYÐmÐйÐ4¹È-ÐMÐ1ˆÐ õÈ-ˆÈ õˆˆÈ -ˆ Ð}Ð}ÐMÐÈ-ÐÕÈ-Ð1È鈈ˆˆˆÐ*áለˆÐሠˆˆˆˆˆˆ ˆˆˆˆˆÈ-È -ˆˆÐ"È-È-È-ˆˆˆ ˆˆˆÐ!ˆˆ2ˆÐõˆBˆˆˆˆˆˆˆˆˆ‰"ˆPˆˆ ˆˆˆ ˆˆ ˆˆˆ ˆˆˆ ˆˆˆ ˆˆˆˆˆˆ ˆˆˆˆˆˆˆˆ ˆ ˆ ˆˆPˆˆˆˆˆˆˆˆˆ ˆˆˆˆˆ ˆ ˆ ˆ ˆ ˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆˆ.ˆˆ ˆˆ ˆ ?     È-È éÈ -ˆÐMÐÈ-Ð=È-ˆ ÐñÐåˆ Ð‘ˆÈ-ˆÈ-Ð1ˆˆˆˆˆˆˆˆˆ$ˆˆ ˆˆÈ-Ð=È-ˆÐՈРáÐõÈ-ˆÐ áÈ -ˆÐÐ1ˆˆ ˆˆˆˆˆˆ ˆ ˆˆÈ-Ð1È-Ð=È-ÐñÐåБˆÐmÈ-ˆ Ð õÈ-È -Ð=Ð1ˆˆˆ ˆ ˆˆ Ð$}Ð}ÐmȈˆ ˆvˆˆ ˆˆˆˆ ˆˆˆ ˆˆ ˆˆˆˆˆ ˆˆˆˆˆˆ,ˆˆ0ˆ ˆˆˆˆ PˆP PˆJˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆPPÐ(�Ð(}Ð}ÐZ}Ð}Ð@}Ð}Ð@}Ð}Ð@}Ð}Ð@}Ð}Ð@}Ð}ˆPˆTˆˆˆÐmˆÐYˆˆˆˆÐ�È-È -ˆ ˆˆˆˆÐMÈ-ˆˆˆˆˆˆˆˆˆ ˆ¢ˆ ˆ-ˆ ˆˆˆˆˆˆˆˆˆˆ¦ˆˆÐ …ˆÈ-È-ˆˆˆÐ …ˆÈ-È-ÐEˆ"Ð !ˆ,ÐÙˆ Ð=P2ˆÐ1ˆÐ=ÐdሠРˆ Ð ˆÐ=Ð=ˆ Ð=Ð=ˆ Ð=P:ˆÐ1ˆÐ=ˆÐPˆÐ=ˆÐ=Ð1ˆÐ1PˆÐ=Ð1ˆÐ=Ð1PˆÐ1ˆfÐÐMÐPˆÐ ˆÐ=Ð1ˆˆÐ=ˆˆˆˆ@ˆÐMÈ-È-ˆ&ÐMÈ-È-ˆˆˆ ˆˆˆ$ˆˆˆ(ˆ ˆ4ˆ6ÐMÈ-È-ˆˆÐMÈ-È-ˆ$ˆNÐMÈ-È-ˆ4ÐMÈ-È-ˆÐMÈ-È-ˆÞÐMÈ-È-ˆˆ&Pˆˆ ˆˆ.ˆˆ Ð MÈ-ˆˆˆ"Pˆˆˆ ˆˆ*ˆˆ ˆˆˆˆ ˆˆ"ˆˆ ˆˆ(ˆˆ Ð MÈ-ˆˆˆ"ˆ Ð }Ð}ˆˆˆˆ ˆP.ˆ ˆˆˆÐ=ˆˆÐ=ˆˆÐ=ˆ@Ð=ˆ Ð=ˆÐ!ˆÐ=ˆÐ!ˆ Ð=Ð!ˆ Ð=Ð!ˆ Ð=ˆ Ð=Ð!Ð=Ð!ˆ Ð=ˆ Ð=ˆÐ=Еˆ Ð=Ð!ˆ Ð=ˆ Ð=ЕˆÐ=Ð!ˆÐ=ˆÐ=ЕˆÐ=ЕˆÐ=ˆÐ1P@PPöˆDÐ=ˆ Ð=ˆÐ=ЕÐ=Ð!ˆ0Ð=ˆ Ð=ˆ Ð=ˆÐ=ˆ Јˆ"ˆˆ>ˆˆ ˆˆˆˆˆˆ ˆˆ"ˆˆˆˆ:ˆˆˆˆPˆ2ˆˆ2ˆˆ0ˆˆˆP ˆˆˆˆˆˆˆ ˆ$ˆˆˆÐMÈ-È-ˆˆˆÐYÈ-È -ÈéˆÈ-Ð1È-Ð=Ð1ˆÐYˆÐYˆÐYˆ6ˆˆˆ"ˆˆ ˆˆÐmˆÐYˆˆˆˆÐ�ˆˆˆÐMÈ-ˆˆˆŠˆˆˆˆ ˆˆˆ(ˆˆˆˆ*ˆˆˆ&ˆˆˆˆˆ ˆ=ÐMˆ Ð=ˆ Ð=ˆ Ð=ˆ Ð=Ð!ˆ Ð=ˆÐ=ˆÐ=ˆÐ=Ð=Ð!ˆ Ð=ˆ Ð=Ð!ˆÐ=Еˆ Ð=ˆ Ð=ˆ Ð=ˆ*Ð=ЕЈ Ð=ЕЈ Ð=ЕˆÐ=Ð!ˆÐ=ˆÐ=P$ˆÐ1PˆÐ=ˆÐ MÐ=Ð!Ð1PˆÐ=ˆÐ MÐ=Ð!Ð1ˆÐ1‰nˆPˆÐ1PˆÐˆRˆˆˆˆˆˆˆÐ<1ÐÎ1ˆrˆˆ ˆˆ ˆˆˆˆ ˆˆ Ð MÈ-ˆ ˆˆˆÐMÈ-È-ˆˆˆˆˆˆ ÐMÈ-ˆ ˆ ˆÐMÈ-È-ˆˆˆBˆˆˆˆˆˆ ˆˆˆˆ0ˆ ˆœˆ ˆˆÐMÈ-È-ˆˆ>ˆPˆ4‰’ˆˆ.ˆ:Ð$áˆÐለˆˆˆˆˆˆ ˆˆˆˆˆ ˆˆ Ð MÈ-ˆ ˆÐMÈ-È-ˆˆ ˆ*Pˆˆ&ˆ=ÐMÐ1ˆˆPˆÐ=Ð1PHˆÐ1PˆÐ=Ð1P2ˆÐ1PˆÐ1PˆÐ1PˆÐMÐ=Ð1PˆÐ1È-ˆ ˆˆˆPˆbPP\ˆPXˆP€ˆˆ(ˆˆˆˆˆˆ*Pˆ0ˆ.ˆˆˆ P ÐáˆP ˆ ˆˆÐሠÐሠÐሠÐሠÐሠˆ Ð$áÐሠˆÐáPˆ P ÐሠÐáPˆ P ÐሠP ˆ P ÐB}ˆ Јˆˆˆˆˆˆˆ ˆˆˆ ˆˆˆˆ ˆBˆ$ˆ.ˆˆ2ˆ.ˆˆ2ˆzˆˆˆˆÐ MÈ-È-ˆˆˆˆˆ ˆ ˆˆˆˆˆˆP ˆˆˆˆˆˆˆˆˆ Ð0éˆ(Ð!PPˆ,ˆ ˆˆˆˆˆPˆPPˆÐ*!P–Ð,}Ðp}Ð}P Pˆ(ˆÔÈ:-Q–P,P$PP8ˆ†ˆÐÑ–áQ>PPˆ†Q¼P(ˆØˆ ˆÈj-ÑèPüˆˆˆ(ˆ ˆˆˆˆˆ.}P ˆBP ˆˆP¨Ð<}P ˆdˆBˆˆˆˆˆˆ(ˆLˆRˆFˆfˆrˆ8ÐH}ˆ Ð}P ˆdˆPœÐ<}P ˆxˆlˆPÐ!ˆ*ЈР!ˆ(ЈP<Ð>1ˆÀP ˆZˆ ˆ ‰tˆ ˆ ˆ ˆ"ˆ ˆ6ˆ ‰rˆ$ˆ8Ðh!Pˆ ˆÐˆ ˆèÐ<ˆÐtˆÉ^-Ð0ˆÈÎ-ˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆˆˆ ˆˆ ˆˆˆ ˆˆˆˆ*ˆˆ ˆˆ&ˆPÐŽÉÐ<u‰>ˆˆÈ-ˆˆ2ˆˆˆˆ ˆ.ˆTˆˆˆÐŽˆ‚ˆ.ˆxÐáˆ"ˆ^ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ2È:-ˆPˆLPvP ˆ*ˆ8PÐ}P ˆ(ˆŒˆ4ˆfP,PdP‰$ˆ Ð~áPœˆPLP®ˆ˜ÐáÐzáÐmÑ áÐmÐ6}ˆ@ˆ ˆˆ ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆPˆ ˆˆˆˆBˆPˆˆˆˆˆBˆPˆˆˆˆˆˆˆBˆP@P,ˆˆˆˆˆ$ˆˆˆˆDˆˆˆˆ ˆPˆBˆPˆ"ˆPˆ ˆ ˆPˆˆP>P0Ð$!ˆ$ˆˆˆˆˆÐ&!ˆ$ˆˆˆˆˆˆ8ˆ ÐለHˆˆˆˆˆˆˆˆ ˆˆˆˆˆˆˆˆPˆ ˆˆ Ðለ¬ˆˆ(ˆˆ ˆ$ˆˆˆˆˆˆ ˆˆ ˆ ˆˆˆˆˆˆˆˆˆ ˆˆ ˆˆˆˆˆˆPP PPPPPDP2ˆ PP(PˆPPP,PP¢ˆ2PP&PPPPLPPPP¾PPlPnP4PnQ&P.P\P*P\PPˆ&Pˆˆ*ˆˆˆ&ˆˆ"ˆ8ˆˆ Pˆˆˆˆˆˆˆ ˆˆPˆ ˆˆPˆˆ ˆˆ ˆPˆˆPˆPPP PJP PâPÈ -P P4PPPPPPˆnP PˆˆˆPˆ2PP P&P:ˆˆ PPPP&Q6Ð!Ð!ˆPˆPP.PXP4PNPP®PTˆPˆˆPˆP PP PP P PPˆ„Ð!ˆˆˆˆ ˆPÊÐ!P(PP*PPPˆÐ!P(ˆPBPPPPPPPP?     ˆˆ ˆˆ2ˆ6PˆˆˆˆFˆPPˆˆ"ˆPˆˆˆQ.PTP,PBP"QVP>ˆ*P>ˆ&PˆˆPˆNˆØˆ È:-È -PˆˆÈ -ˆˆÈ-È2-PˆP Pˆ Pˆ ˆPˆPÈ-È-È-È-ˆˆˆ Pˆ PˆˆPˆPˆˆ Pˆ&Pˆˆ PPPPÈ -Ñ‚!ˆˆ"Ð!PPPPPPP$PP(P6PÈ2-È -ˆÐ&}Ð}P È-È-È-P P8PdPPPPPPP(P:PPPPˆ0ˆLP ˆFP P4P*Ð!PPP2PRPJP2PPP:ˆ(ÐáPPˆ ˆPPˆPPPPPÈ-PP*ˆ PˆÐáPP&PP P(PÈ-PFPPPPPPP(PP(PhPPPPP&ˆP"PP,PPP(ˆ*P&ˆPˆ&ˆPˆPPP P(P PP PpPP.P6ˆ PP,PPPP,PPPP6P PPPˆPPP&P2ˆPDP$PPP PPP"PP*PPPPP,P0PPPPPPPPÐ(!P¨PPP.Ð,!PPPPP P Pˆ PPPˆ Pˆ„ˆ&ˆˆ\ˆ ˆˆˆˆˆˆˆPˆˆˆ PP$Ð!PLPPˆP PˆÐ }PÐ}Ð}PÐ}ˆ PˆPP*PP PP PPP Pˆ"P Pˆˆ PPˆPˆPˆˆ PˆPˆPPPPP PˆˆˆˆˆˆˆPˆ ˆPˆ"Pˆ ˆPˆˆPˆˆˆˆˆˆˆˆPˆˆˆ Pˆ$PP PˆPÈ -P PjÐ!P(PPˆÐ!P(ˆPBPPPPPPPPPÈ -P"PP@ÐX!P&PPPˆˆ P PÐ!P&ˆPP ÐB!P&PPTˆˆ P PÐ&!P&ˆPPP\PPÈ -P P PfˆP0P"ˆ(ˆtˆtˆÐ`}Ð}Ð$!Ð,!ÐHµP P Ð!Ðéˆ ˆˆPPP^Pˆ2ˆ PPˆTˆ PP P(PÐÎáPPˆ2ˆ PPÐáPP"ÐV}P P(PDÐ0}P PPPP4PP4PPPPPPPPPP0PPPPPPPPPˆ P@P"Ð!P(PP PPPPPPˆP P6PPPPPˆ ÐáPTˆ PPPPPP.PPPPP$PPFPVP.PpPPÐ"áP’PPPfP4PPPZP†PPBP P$P PP.PLP0P*PPRPPPP&PP"P&PPPPP$PPP$PP"PPPPÐ~áPjP²P4P¸PPDPP.PPPQP Pˆ ˆˆPPP PPPˆ"ˆ PˆˆˆˆPˆP P P ˆfPNP8PPP P ˆ^ˆ PPPP&P&ˆ*ˆ PP P P6P P,PPPPPPP P&PPÈ0-ˆÌÐ,áÐ0!ˆˆ(PPPˆPP PPP ˆPP P ˆPˆ$P>ÐáPPˆJP ˆ PPP\PP4Pˆ P ˆˆP PˆˆPPˆPPPBPFPPP(PP,P"ˆ4ˆ PP PP,ˆP PˆˆˆˆPLP.P&PôP PPP4P4PPPQ(PŠP*PnPPÔPPPPPPP.P"Pˆˆ(PP ˆÒP"P PPˆˆ PPP4PÐ2áˆ4ˆPˆˆ*PˆPˆ:ˆ$Pˆ$PP ˆ ˆPP ˆLPPˆ ˆˆˆˆPˆPP ˆˆˆP P"PHPЀPXPÈœ-P6P`P:PPÈ-È -È-È-È-PXPPPPPJP(PPP8P P8P2Pˆ4ˆ PPˆPPP PPP Pˆ ˆPˆPP P^PXˆˆˆPP P PP"P"P"ÐáP PPˆ8ˆ Pˆ&ˆ PP˜ˆ*PP:P$P@PPPPP&PPˆPlPPP6PPPPJPNP:PnPP PPˆ*P`Pˆ2PP(P,PP2P<ˆPPˆP ˆPP²P.PˆPP`ˆP P0P4Pˆ*ˆˆP.PtP PP�P.PPP"P.P‰ìÐ"áÐ>áPÔPPbPˆ”ˆP˜P0PPPdPP8PPPPhP$ˆ„ˆ$PPˆ PPPPP,P&ˆPPPDPPPPHPPPhPfPPˆPˆP2PPPPPP(PP PP$PVP(PPP(P*P8P6P8P6PDPPPˆRPPP4PÐ!PP,PP PPP>P(PRPˆP,PPP,PP PˆˆˆPPP P(P2PP2PPPPP PˆXˆ PPPPPPPP6PP PˆˆPPP PPP PRP ˆˆ PPPPPPdPPP(PPP*PPPP2PPP(PPP*PˆPP PPšPPPPPPˆˆPPˆPPP P P4P*P0PÀPPRP”PPPbP$ˆˆ PˆPˆPP ˆˆPP2PP&P P8PˆPˆ PPP*PP PPPPPPPP PPP PPPPPPPPPP PPPbPPÐN}P Ðf}P PP PÐ áPˆPPˆP PPP6P P@PÐ áPP ˆPPP PPPPJPˆPP PˆˆˆˆPˆPˆPP PˆˆˆˆˆPˆÐFáˆBPNPPˆ*ˆˆPPPP PPBPPPPˆXˆˆPˆ8ˆ6ˆPˆ PPP>Ð!P&PPBÐ!PPP.Ð!P&PPPP P.PPPPˆˆˆPQ:P¬PP8PDÈ -PZPPÐ!Ð!ˆP>P(ˆzP$PP"ˆ P`P*ˆ ˆPˆ PPP P PPP8P0PˆPPP PPPPPlP2Pˆ PPÈ"-‰¤PPP PBPPˆˆ¾P6PPˆ PP\PP P&PPP`PPPP8ˆ8ˆ PˆPPP$PPJPPPPPNPP ˆˆˆˆˆˆˆ PˆˆPˆPˆ&ˆPˆ ˆPˆPPPPP0ˆˆ PLˆˆ PPPˆˆ PˆPPˆPPˆ<ˆP PˆÐáÐ!P$PP$P PPP"PLÐ!P$P,Pˆ*ˆˆ>P ÐÅP ˆPP,ÐÅP ˆPˆˆ(ˆPPjP6P PP PJPP*Pˆˆ PˆˆˆˆPˆ ˆPˆˆ PPPPP PˆˆˆPPˆ,ˆPˆˆPˆˆˆJˆPJPˆ ˆPPpPP ˆPˆˆˆˆ ˆˆ P ˆˆPˆP ˆˆP>Ð,}ˆP ˆP ˆˆÐ !ˆˆˆˆPPˆ ˆPˆBˆPnˆ ˆˆˆZˆˆ ˆˆˆPÐÅP ˆˆˆˆˆˆPˆPPˆ Ð áPˆÐÅP ˆFˆ:ÐnÑÐÑЩÐPPHP2PzPˆÊˆ ˆ ˆ Pˆ P(PxˆP*P2ˆˆ Pˆ ˆ^P È(-È -Ð(PÐmPÐáÈ -È-È-P ˆ@ˆÈ-È -Ð.eÐ8YÈ-È-È-È-È -Pˆ°ˆÐ4uˆÐ4uˆˆ&ˆˆhˆÐ4uˆÐ4uˆˆ(Ð4uˆˆ&ˆÐJňˆˆˆˆˆˆ PˆˆˆˆÐ1Ð ‘Ð ¥ˆÐmÈ -ˆÐYP È-P È-ˆ6Ð !ˆÐ !ˆÐ !ˆÐ !PˆÐ¥Ð,}PÐ}Ð}È鈈ÈéÈ -Ð1È-Ð=ÐMÐ=È-ˆ ÐñÐ刈ˆÈ-Ð=ˆ ˆÐ:}ˆˆ ˆˆÐ=È-PPÈ-ˆÐ:}ˆˆ ˆˆÐ=È-PPÈ-È-Ð1PˆÐˆÐˆˆ P ˆˆˆ ˆLˆPÐňˆˆDˆ@P4ˆ8ÐnÑÐÑЩÐPPFPPPzˆTP Ð!ˆ P:ˆˆ Pˆ ˆbP È(-È -È4-È-È-P ˆ@ˆÈ-È -Ð.MÐ8qÈ-È-È-È-PÐB!ˆ†Ð4uˆÐpuˆRˆ$ˆjÐ4uˆˆ&Ð4uˆˆ&ˆ$ˆ<ˆÐ ለPˆˆˆÐňP&ˆ&Pˆ,ˆ>ˆˆˆˆˆ P ˆˆˆ<ˆPÐňˆˆBP P"P2ˆˆ ˆˆˆ ˆjˆÐ …ˆÈ-È-ˆˆÐ …ˆÈ-È-ˆˆÐ …ˆÈ-È-ÐEÐ!Ð<!ˆ*ˆˆˆ*ˆ ˆ Ð!Ð…ˆ>ˆ ˆˆ.ˆ\ˆ ˆ ˆ P@ˆ$PˆPHPP6ˆ"PPP:PDˆ(PˆPP$P(P6P&ІáPˆ*ˆˆ PÐ:ÅP ˆÐFÅP ˆˆPˆ ÐFÅP ˆP4P(ÐFáPPPP.Pˆ ˆRÐx!ˆ Ðh1Ð2éÐBÅP ˆˆPPˆPP"ˆ2ÐFňP`PPPHЬáP¢P(ÐNáPÐáP„PNPPPPˆ@P ‰ˆÐrÉÐ&¹Ð&™Ð&‘Ð&uÐ& PˆÐ:ňˆˆP ˆˆ‚ˆPˆˆÐP!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!È-È -ˆÈ -È-ˆ$ˆ ˆ ˆ ˆ ˆˆP>ˆ2ˆÐሠˆPÐbáPPPfP&Ð8ňˆPˆP P ˆÐVÅÐ"ňˆˆPˆ ˆ.ˆ0PPP ˆP$P4ˆPˆP ˆˆ<ˆ ÐÅP ˆˆÐ"áPP(PP.P&P P†P(P‰ˆPˆ ˆ:ˆ"ˆˆˆˆPˆ ˆPˆ Pˆ PˆˆPÐÅP ˆ$PˆˆPˆˆPP0ˆˆ$Pˆ Pˆ8Pˆ ˆˆˆˆP ˆ(ˆ&P P8ˆ ˆ P ˆ0PP>ÐÅP P ˆRÐÅP ˆˆ ˆÐ áPˆˆˆˆPˆ4PˆˆÐÅPˆPP(Pˆ–PÐÅP ˆ6P0P2PPˆP(P0ˆPˆPPPˆJPPˆnPPˆ2PPˆ$Pˆ$Pˆ&PP"ˆ.Pˆ:PP"ˆ\PÐňˆzÐáˆP PÐň.ˆPÐň0ˆNÐ!ˆ\P Pˆ:PÐňˆ P:P"PÐ"!ˆP„P&PPšˆ&PPÐňˆPPP4ˆFPPPnP4PP8P.ˆ8Pˆ ˆ ˆPPˆ&P4ˆVÐ*!Ð(ňˆ ˆˆˆP ˆPPÐňˆÐ!ˆˆˆ.ˆ PˆPPÐÅÐH!ˆ.ˆ Pˆˆ PPP.ˆP ˆÐÅP ˆ P$Pˆ ˆPˆPˆFˆˆ$ˆPPFPPˆˆ&ˆˆˆ ÐÅÐ áPˆ ÐÅP ˆˆÐለˆ ˆÐÅÐ áPˆÐÅP ˆ ˆˆˆˆ ˆˆˆ ˆ ˆ PPˆˆÐj!Ðn1Ð4éP ˆˆP$ˆˆˆ$ˆPˆ*ˆ PPˆˆ ˆP4PPˆPPˆhPJˆ P ˆPˆŠˆ,PPˆ:PPˆ(Pˆ2Pˆ P PÐÅP ˆˆˆˆˆÐ"ሠˆ Pˆ,ÐÅÐ8ňˆ ˆˆ ˆˆPˆP P ˆ2P&ˆ ˆÐáPˆ PˆPÐÅÐ"áPˆ*ˆ PP0ˆ0ˆPPˆP&PP2ˆPPPfˆPPˆ"ˆPÐÅPˆ ˆ PPˆ(ÐN!ˆˆˆ Pˆ"ˆ(ˆPˆPˆ8ˆ ˆ ˆ ˆ PP PP PˆÐáP Pˆ4Pˆ ˆÐ áPˆˆˆˆˆˆ$PÐÅPJP ˆ ˆPÐňˆTPˆP&PP*PP"P4ˆÐˆP,PP(P*ˆ4P0ˆPP2ÐáÐÅP ˆœP&ˆ ˆˆ4È-È -ˆ È-È-È-P ˆˆP Ð!ˆˆBÈ -È -ˆÐ È4-È-È-P ˆˆ,ˆˆ PˆˆˆˆPP(ˆˆˆˆ Pˆˆˆ&ˆ*ˆ Ð"áPˆˆˆˆˆˆ ˆPˆ ˆˆˆˆ@ˆ*ˆˆˆPPˆ Pˆ ˆˆ$ˆ^Pˆ(ˆP ˆ:ˆˆ P:P$PÈ*-È -È:-È-È-P ˆPRˆ8ˆFP"ňˆ PPÐňˆPPÐňˆ PPPˆÐ ňˆPPÐňPšˆPÐ áPQ PRPˆPPP P.ˆP ˆˆ&PPPP4ˆP ˆˆÐለ0ˆNÐለˆ4ˆ@P"PP.Ð"ňPPP,ÐňˆˆPˆPPÐÅP ˆPPPÞP>P*ÐňP*ˆPPÐÅP ˆ&Ð ሠÐ!ÐÅPPPˆPˆP ÐÅPPPP ˆ@ˆPˆˆ^ÐréÈ-È -Ð$¡ÐAÐ9È$-È-ˆP ˆˆlˆ PPˆˆPPˆ2ˆP P0ˆ\ˆPPˆ(ˆ0ˆP ÐáÈ(-È -Ð<¡Ð UÐ ©Ð ÁÐ }Ð È-È-È-È-È -È-PP\ˆˆˆˆˆˆ ˆ,ˆ ˆ:P|Ð&!ˆ>ЈTÐÅP ˆˆP*ˆˆ PPPBPˆPÐÅP ˆ PPˆˆ(ˆ&Pˆ Pˆ ÐZ!ЈzÐVÑÐÅÐ ˆ&Ð,ˆPPÐÅP ˆRˆPˆˆP Pˆ PPPP\Ð(ňˆˆˆ PˆˆˆPPP,ÐňˆˆPˆPPPP4ˆP ÐÅP PPˆDPP$ÐáPÐÅÐ PˆP ÐÅP P ÐňPPP(ˆÐ áPÐÅP ˆ P ÐňPPP(ˆPPPÐ.]Ð PLˆˆP ÐÅP PÐňP$ˆ P ˆ ˆˆˆ,ˆPˆ.PPPˆP2ˆÐňˆPP@     ˆP"Ð(]ÐÅÐ&!ˆ ˆ Ð0ˆˆPPˆPˆPPP.ˆP Ð!Ð$P:P ˆ>PÐ!Ð4ÅÐ ˆPP@ÐáPˆ P ˆDˆˆP PˆÐ áPP ˆ*ˆˆˆˆ(ˆPÐ@}P ˆ0ˆˆˆ&ˆˆˆˆ Pˆ.Ð}P ˆˆˆˆˆˆ ˆˆˆ ˆˆˆˆ ˆˆˆˆP:ˆP ˆ ˆˆ:P Ð!ˆ P ˆˆPˆÐÅÐ áPÐÅP ˆPˆPPP.ˆP Ј ˆPÐÅPˆPÐÑÐÅP ˆˆ ˆÐáˆP ˆTÐýˆÐˆÐለ2ÐЕÐ}Ð}ˆˆ ˆÐmˆ ˆÐሠˆÐmРሠˆÐሠˆˆTÐ !ˆˆ*ЈР!ˆˆ8ЈР!ˆˆ(ЈР!ˆˆ6ЈР!ˆˆ8ЈР!ˆˆ,ЈР!ˆˆ,ЈР!ˆˆˆÐ !ˆˆ$ˆÐÅÐ ˆÐ !ˆÅP ˆÐ!ˆPˆ ˆÐPˆˆP PÐÅPˆˆ ˆPÐáˆPP"ˆÐ!ˆ ˆP$ˆÈ-P ˆ"PˆÐÅÐ áPÐÅP PP@ˆP ÐÅP ˆˆˆÐ!ˆPˆÐˆ PˆˆP PP ÐňPˆÐÅÐ áPÐÅP Pˆ P4ˆ Ð!ˆPˆ ˆ Јˆ ˆˆ&ˆ,PP ˆˆˆP PÐÅPˆ Pˆ PPˆ$ˆ PÐÅPˆ P Pœˆˆ$ˆÐ&Ð"!Pˆ ˆÐP Ð!Pˆ ˆÐÅÐ P Ð!Pˆ ˆÐP Ð!Pˆ ˆÐP Ð!Pˆ ˆÐP Ð!Pˆ ˆÐÅÐ P Ð!Pˆ ˆÐP Ð!Pˆ ˆÐP&Ð!Pˆ ˆÐÅÐ P&Ð !ˆPPˆ0ÐP ˆÐ!Pˆ ˆ(ÐP Ð!Pˆ ˆÐÅÐ P ˆÐ !ˆPˆ ˆÐÅÐ ˆ ˆPP”ˆÐ !Pˆ6ˆ P ˆˆÐለ$PˆPˆ PPˆPPˆÐÅÐ áPP ˆPˆˆ ÐÅÐ ሠPˆˆZˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆˆ ˆÐ áPP ÈŽ-È-Ð1È-ÐMÐ&ÐÐ ÑÐ !ÐÐ1È-ЈÐ!ЈˆˆˆˆÐň2PPˆˆÐH�Ð,}P ˆˆPˆˆPÈ-ˆˆˆˆ&PˆP ÐÅP P ˆPPÐ!ˆ@PPPˆÐň ÐÅÐ áPÐň ÐÅP ˆPˆPPÐ ň Ðň6ˆˆ"P ˆ8ˆPˆ ˆ&P ˆ8ˆPˆ PˆPÐ:ለ ˆˆˆ(P ˆPˆÐÅÐ áPÐÅP PˆˆˆÐáˆXˆˆP4P6PP¶Ð&!Ð.!ˆ2Pˆ Ð(Pˆ6PPPˆ ˆˆˆˆP|ˆ*ˆˆˆ~P ˆPP$PˆˆPˆPˆP Ð áPP$ˆ*ˆP P,PPÐÅP Pˆ6ÐÐ!ˆP Ð!ˆPˆˆÐÅÐ PPˆPPÐÅP ˆP Ð !ˆPˆˆÐÅÐ PPˆP ÐÅP P ˆP ÐÅP PPBP<ˆP"PˆPPˆPPˆˆPˆPˆ6ЩРÅÐ PÖÐ"mÐP<ˆP ˆhÐÅÐ áPÐÅÐÅP ˆPˆÐ áPÐÅP ˆÐ ለˆ PˆP Ð!ˆPˆÐˆPDPÐЈРáPˆˆPˆˆˆˆˆÐˆÐˆˆˆˆP ˆP"ˆˆˆˆ PPˆˆPˆˆˆ"PPPˆ ˆˆ"P0PˆˆP PÈ -P&P(È-ˆˆˆˆÐˆˆPPˆÐ áPP ÐtáÐP}P Ðb…È -È-Ð…È -È-ˆ ÐYˆÐmÈ-ˆ ˆ Ð}P йÈ-ˆ Ð}P ÐD¹È-ˆ&Ð}P ˆˆ&ÐYˆÐmÐ"Mˆ*Ð}P ˆ Pˆ0ÐÐÅÐÅP ÐÅPˆ P P ˆP PˆP Pˆ Pˆ PˆP Ð*!Ð!ˆPˆˆÐPP ˆÐÅÐ áPÐÅP ˆPˆPˆPÐ0áPˆ P PP2ˆ(ˆPPBˆ ˆÐ`áPPP2Ð!Ð!PRˆÐ áPÐÅP PˆPˆÐÅÐ áPÐÅP ˆ PˆÐÅÐ áPÐÅP PPhP(ˆP ˆP ˆP ˆ&PP|P6P*Ðü!ˆÐˆ$ˆˆˆˆˆ}Ð}ˆ Ð}Ð}P ˆ8Ð}Ð}P ˆ ˆˆˆˆˆˆˆˆˆˆˆˆ(ˆÐYˆˆÐmˆÈ-ˆˆˆˆPˆˆˆˆˆˆˆˆˆ ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ*ˆˆPˆˆPˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆÐ YÐEˆ®P ÐÅP ˆˆˆˆˆ P ˆ ˆ P4ˆ&Ð!ˆ&ˆˆˆˆP ˆˆˆˆPˆ$P Pˆ*P ˆˆP4ˆNˆˆ8ˆÐáPˆÐÅP ˆˆÐለˆˆÐሠÐ!Ð@PˆÐ!ˆPÐ(PPPˆÐÅÐ áPÐÅP ˆP$ˆˆPPˆ Pˆ(ˆˆPPˆˆ P P ÐÅPˆ P"Ð!ˆÐ2PˆPPÐÅPPÐ!Ð"ˆPPPPP8P(P PˆpˆˆÐ áPP Én-È -ÈD-È-È-P ȶ-È -È -È-È-P PLÐHˆ Ð!ˆDP Ð!ÐéP ÐZ!ÐéP ˆˆˆPˆˆP ˆˆÐ áP PˆPˆPˆÐÅÐ áPÐÅP ˆÞˆÐ áPP ˆÐ ሠˆ€P P ˆÐ áPP ˆ ˆ”ˆˆÈ-ˆP ˆÐ ሠÐZÅÐ(ÅÐ"ňP ˆˆ2ˆPP ˆˆPP ˆˆPˆP Pˆˆˆ"Ð ሠPNP PÐ4ÅPˆˆˆPP ˆˆPPPˆˆˆ4P ˆPÐÅP ˆ:ˆˆ:!ˆ ÐÐ&PˆÐ"!Ð!Ð,ˆ P ˆPˆˆNPP ˆPPˆPPPÐÅP PfPÐÅP ˆ"PPÐ>ÅPP$PÐ!Ð4ˆˆP PÐÅPP$PP$ˆPˆPPˆPPˆˆÐÐÅPÐLáPÐ"©Ð ÅÐ ˆ¨PˆÐÅÐ áPÐÅP PˆPˆP®ˆ~Ð áPÐÅP ˆˆÐ!Ð!ˆPÐ(PBPPˆÐ áPÐÅP ˆPˆˆP ˆˆˆˆˆˆˆˆÐÅPˆˆPÐÅP ˆˆ ÐÅÐ áˆ*ˆˆP ˆˆÈX-ˆˆ^ˆˆˆ&P ˆˆˆ ЈˆˆˆˆÐˆˆˆPPˆP ˆ ˆP ˆˆˆDˆ,ˆˆˆˆP4Ð!Ð!Ð!ˆPЈ@ˆ:P&ˆ ˆˆˆˆˆˆˆ ˆˆ0ˆˆ$PˆPPˆPˆPˆˆˆ ˆˆPˆˆPPPLˆÐ!ÐéP ˆˆˆ ˆˆˆˆˆPPÐÅPÐ*©Ð ÅÐ ˆ6PˆÐ áPÐÅP ˆ Ð^!ÐBPˆÐ!ˆPˆˆ PPÈ-È -ÐÈ -È-È-P P4ˆPPÐ!ÐRÐ$ň0P PˆPˆPPˆPPPÐD©Ð ÅÐ PÚÐ"mÐP0ÐèmÐ0mÐ.ˆ‚ЈˆÐáPˆÐÅP ˆˆÐሠˆÐሠˆPˆ ˆÐáPˆÐÅP ˆˆPˆˆˆˆPˆˆPPÐÅP ˆ$ˆP ˆˆˆˆPˆˆPPˆˆˆP ˆPˆPPˆˆˆˆˆÐˆˆˆ ˆˆPˆД}P ˆLPˆÐ áPˆ P ˆ PPˆˆˆjˆˆPˆˆ ˆˆˆˆˆÐ áPˆÐ ሠˆ~ˆˆˆˆ.ˆPˆˆPˆˆˆˆPˆ P Pˆ ˆˆÐ ሠPNPPP*Pˆ ˆP"ˆˆˆPˆˆˆ$P P ˆˆˆˆˆˆˆÐR}P A     ˆˆÐˆÐ !ˆˆ*ЈР!ˆˆ2ЈР!ˆˆ(ЈР!ˆˆBЈР!ˆˆ:ÐP8PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPÑÌáÐ!Ð!ÐD!ˆ ÐjáˆÐÅÐ ÐáˆÐÅÐ ÐáˆÐÅÐ ÐP PPPPPP PPPPPPPPPP PPPPPP PPPP PPPPPPPPPPPPPPPPPP PP PPPP PP PPPP PP PPPPP PPPPPPPP PP PPPPPP PPPPPPPPPP PPPPPP PPPP PPPPPPPPPPPPPPPPPP PP PPPP PP PPáˆÐÅÐ ˆÐP Ð`!ˆ&ÐP@PPPPPPPPPPPPPPPPPPPPPPPPPPPPÐü!ˆÐ@áÐ!Ð!ˆZˆˆˆˆˆˆˆ ˆˆˆˆˆˆˆˆˆˆ ˆ,ˆ&ˆˆ.ЂáˆÐÅÐ ÐáˆÐÅÐ ÐáˆÐÅÐ ˆ ÐÅÐ ˆ ÐÅÐ ˆÐP ˆdˆˆ ˆ ˆˆˆˆˆˆˆˆˆˆˆˆ ˆˆ This floppy contains the source for the PaWS SCSI driver, a copy of the modcal version of the PaWS Pascal compiler, and a stream file (MAKE_SCSI.TEXT) which shows how to build the SCSI driver (SCSILIB, SCSIDISC, SCSIDVR). The modcal version of the COMPILˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ ˆ ˆˆ ˆ ˆˆˆˆˆˆˆˆˆˆ(ЈЈЈˆÐň ÐÅÐ ˆÐˆˆÐÅÐ ˆÐˆÐˆÐˆbˆˆÈ(éˆ ˆ ˆÐ]ˆ ˆÐqÐ]ˆˆÐ]ˆ ˆÐqÐ]ˆÐmˆÐ]ˆ Ð�È-Ð=Ð=Ð=ÐPÐ!ÐPÐER (3.25M) is required for building these modules. !ÐPÐ!ЈÐMЈÐMÐ1È-Ð1È-Ð=Ð1È-Ð=Ð=Ð1È-Ð1PPˆˆˆˆˆˆˆˆˆˆˆˆÐPˆˆˆˆˆˆˆˆˆPˆˆÐ !ˆˆÈ-ˆˆˆÐ !ˆˆˆÈ -Ð1È-Ð=ˆÐ !ˆPÐ>ˆÐˆ†È-Ð!ÐõÐ6!ÐõP ˆPˆ*Ð,éÐ>!ÐŽéÈ -Ð6!ÐX This floppy contains the source for the PaWS SCSI driver, a copy of the modcal version of the PaWS Pascal compiler, and a stream file (MAKE_SCSI.TEXT) which shows how to build the SCSI driver (SCSILIB, SCSIDISC, SCSIDVR). The modcal version of the COMPILEÐÐ$!Ñb!PˆPPÐ(ÅPÐ<áP6P(ˆ.PP&P"PPfP