IMD 1.17: 25/12/2009 20:11:32 ctos iii system build utiities r01.01.00 b25-vbu 3of3    9|P^%SET(TRUE,0FFh) %SET(FALSE,0) TRUE EQU 0FFh FALSE EQU 0 %SET (nRqNoRemoteTerm,0) %SET (m_nOsProcDesc, 0) %SET (m_nRgInitRtcRequest, 0) %SET (m_nInitProcHardware, 0) %SET (m_nInitProcIntDisable, 0) %SET (m_nInitProcIntEnable, 0) %SET (m_nSetIntHandler,0) %SET (m_nRgMassIo, 0) %SET (nDcbTemplate, 0) %SET (sOsProcStacks, 0) ; WsType definitions: %' Obsolete iwsStandAlone EQU 0 iwsCluster EQU 1 iwsMiniMaster EQU 2 iwsIopMaster EQU 3 aws210 EQU 4 aws220_240 EQU 5 ;AWS-220, AWS-230, AWS-240 awsMaster EQU 6 %' Current valid wsTypes ngenCluster EQU 7 ngen EQU 8 ngenMaster EQU 9 srpCpMaster EQU 12 srpGpMaster EQU 20 ; ClusterConfig definitions: standAlone EQU 0 cluster EQU 1 master EQU 2 ; HardwareType definitions FPtype EQU 10 TPtype EQU 11 CPtype EQU 12 SPtype EQU 13 DPtype EQU 14 RpType EQU 15 ; obsolete NpType EQU 16 ; this is Unisys' Np BtType EQU 19 ; BootTape/OsLoader GpType EQU 20 SiType EQU 21 ; Gp with Si board CiType EQU 22 ; Gp with Ci board PcType EQU 4 ClType EQU 32 ; Comarch RS422 APType EQU 64 ; obsolete AP2Type EQU 65 ; obsolete data SEGMENT PUBLIC 'data' DGroup GROUP Data PUBLIC nInitProcHardWare, rgInitProcHardWare PUBLIC nInitProcIntDisable, rgInitProcIntDisable PUBLIC nInitProcIntEnable, rgInitProcIntEnable PUBLIC nRgInitRtcRequest, rgInitRtcRequest PUBLIC nOSProcDesc, rgOSProcDesc PUBLIC nSetIntHandler, rgSetIntHandler PUBLIC rgOsTable, endOsTable PUBLIC iMySlot, wMySlotBits EVEN wMySlotBits DW ?  ; SHL(iMySlot,10). iMySlot DB ? ; Constructed from bMySlot. data ENDS ;**************************************************************************** ; MACRO DEFINITIONS ;**************************************************************************** ; %*DEFINE(Begin)(%DEFINE(FS)(0FFh) TCode SEGMENT BYTE PUBLIC 'data' TCode ENDS DGroup GROUP TCode data SEGMENT PUBLIC 'data') ; ; ; EXTRN -- declare a label extrn and outside of the data segment. This will only ; work if called from within segment "data". ; %*DEFINE(Extrn(label))(%' data ENDS %IF (NOT %*ISDEF(%label)) THEN (%' EXTRN %label:far )FI%' data SEGMENT PUBLIC 'data' ) %*DEFINE (debl(text)) (%' %' %'deblank--expand to text, less leading blanks, up to first blank %' %match(debl1 debl2)(%text)%' %while(%len(%debl1) eq 0 AND %len(%debl2) ne 0)(%match(debl1 debl2)(%debl2))%' %debl1) %' This gets re-defined for OS sysgen. %*DEFINE(ResidentDataBoundry(size))( OsTable SEGMENT PUBLIC 'Data' DGroup GROUP OsTable rgOsTable DB %size DUP(0) EVEN endOsTable DW 0 OsTable ENDS ) ; ; define the CTOS processes ; StrSeg SEGMENT PUBLIC 'memory' PUBLIC rgOSProcName rgOSProcName LABEL BYTE StrSeg ENDS %*DEFINE (OsProcName(name))(%' %OUT(.) StrSeg SEGMENT tmp0 EQU OFFSET $ DB 0 DB '%debl(%name)' tmp1 EQU OFFSET $ DB 0 ; null terminate list ORG tmp0 DB tmp1-tmp0-1 ORG tmp1 StrSeg ENDS ) %*DEFINE (OsProcDesc(pEntry, sStack, priority, defaultExch, pCheckProc))( ; pEntry arg contains optional /name %match(proc / name)(%pEntry) %IF (%m_nOsProcDesc EQ 0) THEN( rgOsProcDesc LABEL BYTE )FI %SET(m_nOsProcDesc, %m_nOsProcDesc + 1) %EXTRN(%proc) %IF (%NES(%pCheckProc, 0)) THEN( %EXTRN(%pCheckProc) )FI DD %proc DW %sStack DB %priority %IF (%defaultExch EQ 0) THEN( DW 0 )ELSE( %IF(%FS) THEN( DW %defaultExch )ELSE( DW %SysExch %NameSysExch(%m_ExchLast, Sync%pEntry) )FI )FI DD %pCheckProc %IF ((%len(%name)) EQ 0) THEN ( %OsProcName(%proc) )ELSE( %OsProcName(%name) )FI %SET(sOsProcStacks, %sOsProcStacks + %sStack) ) $EJECT ; ; procedures to do initially on startup ; %*DEFINE(InitProcHardware(pEntry))(%' %IF (%m_nInitProcHardware EQ 0) THEN (%' rgInitProcHardware label byte )FI%' %SET (m_nInitProcHardware, %m_nInitProcHardware+1)%' %EXTRN(%pEntry)%' DD %pEntry ) $EJECT ; ; procedures to do before turning on interrupts ; %*DEFINE(InitProcIntDisable(pEntry))(%' %IF (%m_nInitProcIntDisable EQ 0) THEN (%' rgInitProcIntDisable label byte )FI%' %SET (m_nInitProcIntDisable, %m_nInitProcIntDisable+1)%' %EXTRN(%pEntry)%' DD %pEntry ) $EJECT sbInitNameSeg SEGMENT BYTE PUBLIC 'memory' sbInitNameSeg ENDS rgpInitNameSeg SEGMENT BYTE PUBLIC 'memory' rgpInitName LABEL DWORD PUBLIC rgpInitName rgpInitNameSeg ENDS %*DEFINE(InitName(name)) ( sbInitNameSeg SEGMENT m_InitProc EQU OFFSET $ DB %LEN(%name) DB '%name' sbInitNameSeg ENDS rgpInitNameSeg SEGMENT DD m_InitProc rgpInitNameSeg ENDS ) ; ; procedures to do after turning on interrupts ; %*DEFINE(InitProcIntEnable(pEntry))(%' %IF (%m_nInitProcIntEnable EQ 0) THEN (%' prgpInitName DD rgpInitName PUBLIC prgpInitName rgInitProcIntEnable label byte )FI%' %SET (m_nInitProcIntEnable, %m_nInitProcIntEnable+1)%' %EXTRN(%pEntry)%' DD %pEntry %InitName(%pEntry)%' ) $EJECT ; ; requests to initialize RTC ; %*DEFINE (RtcRq(pRequestBlock,timeInterval,resetValue,cEvents,exchange,rqCode))( %IF (%m_nRgInitRtcRequest EQ 0) THEN(rgInitRtcRequest label byte)FI %SET (m_nRgInitRtcRequest, %m_nRgInitRtcRequest+1) %EXTRN(%pRequestBlock) DD %pRequestBlock DW %timeInterval,%resetValue,%cEvents,%exchange,%rqCode ) %' %' System common subroutine entry points %' %*DEFINE(SystemCommon(iProc, "pEntry", "TCode")) LOCAL m_TCode (%' %IF (NOT %IsDef(rgSystemCommonInstall)) THEN (%' %SET(m_nSystemCommonInstall,0) PUBLIC nSystemCommonInstall, rgSystemCommonInstall rgSystemCommonInstall label byte )FI%' %SET(m_nSystemCommonInstall,%m_nSystemCommonInstall+1) DW %iProc %EXTRN(%pEntry)%' DD %pEntry %IF(%LEN(%TCode) EQ 0) THEN (%' DD 0 DW 0 ) ELSE ( TCode SEGMENT BYTE %m_TCode DB '%TCode' TCode ENDS DD %m_TCode DW %LEN(%TCode) )FI%' ) $EJECT %' %' Interrupt entry points %' %*DEFINE(Interrupt(tyDev, "pEntry", fDevice, fRaw))(%' %IF (NOT %IsDef(rgSetIntHandler)) THEN (%' rgSetIntHandler label byte )FI%' %SET(m_nSetIntHandler,%m_nSetIntHandler+1) DW %tyDev %EXTRN(%pEntry)%' DD %pEntry DB %fDevice, %fRaw ) ; tyDevice values, also in Interrupts.edf and SysGen.asm. tyController EQU 0 tyCascade EQU 1 tyCascade2 EQU 2 tyExternal EQU 2 tyPIT EQU 3 tyRTC EQU 4 tyLPT EQU 5 tyKBD EQU 6 tyRS4221 EQU 7 tyRS4222 EQU 8 tyFloppy1 EQU 9 tyWD2010 EQU 10 tySCSI1 EQU 11 tySCSI2 EQU 12 tyDmaTC EQU 13 tyDoorbell EQU 14 tyRS232AB EQU 15 tyRS232CD EQU 16 tyRS232EF EQU 17 tyRS232GH EQU 18 tyCoprocessor EQU 19 tyRedirect EQU 20 tyRS232IJ EQU 21 tyMegabusDma EQU 22 tyEccError EQU 23 tyXINTR0 EQU 24 tyXINTR1 EQU 25 tyFloppy2 EQU 26 tyXINTR3 EQU 27 tyXINTR4 EQU 28 tyHINTR87 EQU 29 tyKbdXmit EQU 30 tyXBusTimeout EQU 31 tyVoice EQU 32 tyHINTR71 EQU 33 tyIRQ5 EQU 34 tyIRQ10 EQU 35 tyIRQ11 EQU 36 tyIRQ15 EQU 37 tyDevLast EQU 37 $EJECT %*DEFINE (RequestNoRemoteTermination(rc)) ( %IF (%nRqNoRemoteTerm EQ 0) THEN ( rgRqNoRemoteTermination LABEL BYTE )FI DW %rc %SET(nRqNoRemoteTerm, %nRqNoRemoteTerm+1) ) %*DEFINE (EndRemoteTermination) ( PUBLIC prgRqNoRemoteTermination, nRqNoRemoteTermination prgRqNoRemoteTermination DD rgRqNoRemoteTermination nRqNoRemoteTermination DW %nRqNoRemoteTerm ) %' This macro checks and allocates file system data structures. %*DEFINE (FileSystem(model)) ( %SET(fNGen,0) %SET(fSrp,0) %SET(fSI,0) %SET(fFp,0) %SET(fDp,0) %SET(f%model,0FFh)%' Sets one of fNGen, fSI, fFp, fDp, fSrp. %IF (%fSI OR %fFp OR %fDp) THEN ( %SET(fSrp,0FFh) )FI %If (Not(%*Isdef(%cbNameSpace))) Then (%Define(cbNameSpace)(4096))FI %If (Not(%*Isdef(%cbNameCompactionGoal))) Then (%Define(cbNameCompactionGoal)(%eval(%cbNameSpace/2)))FI %IF (%nFab GT 6550) THEN (%OUT(nFab must be no greater than 6550.))FI %IF (%nFub GT 4315) THEN (%OUT(nFub must be no greater than 4315.))FI %IF (NOT (%*ISDEF(%fFabUfbOwnSeg))) THEN ( %IF (%fSi) THEN ( %SET(fFabUfbOwnSeg,%TRUE) ) ELSE (   %SET(fFabUfbOwnSeg,%FALSE) %IF (%nFab GT 1000 OR %nFub GT 1000) THEN ( %SET(fFabUfbOwnSeg,%TRUE) %OUT( %' 'With this many Fabs/Fubs, change %' %' 'Fs_%if(%fFp)then(Fp)else(%if(%fDp)then(Dp)else(N)fi)fi%' %' '.fls to list HfsUfb2 instead of HfsUfb before linking. %' ') )FI )FI )FI %IF (%fFP) THEN ( %IF (%Pass1) THEN ( %IF (%*ISDEF(%nDisk)) THEN ( %IF ((%nDisk LT 1) OR (%nDisk GT 4)) THEN ( %OUT(nDisk must be between 1 and 4) ) FI ) ELSE ( %OUT(Define nDisk) ) FI ) FI ) FI %IF (%fDP) THEN ( %IF (%Pass1) THEN ( %IF (%*ISDEF(%nDisk)) THEN ( %IF ((%nDisk LT 1) OR (%nDisk GT 6)) THEN ( %OUT(nDisk must be between 1 and 6) ) FI ) ELSE ( %OUT(Define nDisk) ) FI ) FI ) FI %IF (%fSI) THEN ( %IF (%Pass1) THEN ( %IF (%*ISDEF(%nDisk)) THEN ( %IF ((%nDisk LT 1) OR (%nDisk GT 14)) THEN ( %OUT(nDisk must be between 1 and 14) ) FI ) ELSE ( %OUT(Define nDisk) ) FI ) FI ) FI %SET (dcb0,0) ; no dcbs defined initially %SET (dcb1,0) %SET (dcb2,0) %SET (dcb3,0) %SET (dcb4,0) %SET (dcb5,0) %SET (dcb6,0) %SET (dcb7,0) %SET (dcb8,0) %SET (dcb9,0) %SET (dcb10,0) %SET (dcb11,0) %SET (dcb12,0) %SET (dcb13,0) %SET (dcb14,0) %SET (dcb15,0) %SET (dcb16,0) %SET (dcb17,0) %SET (dcb18,0) %SET (dcb19,0) %SET (dcb20,0) %SET (dcb21,0) %SET (dcb22,0) %SET (dcb23,0) %SET (dcb24,0) %SET (dcb25,0) %SET (dcb26,0) %SET (dcb27,0) %SET (dcb28,0) %SET (dcb29,0) %SET (dcb30,0) %SET (dcb31,0) %If (Not(%*Isdef(%cDiskLogThreshold))) Then (%Define(cDiskLogThreshold)(0))FI %If (Not(%*Isdef(%cSegAllocateMax))) Then (%Define(cSegAllocateMax)(0FFFFh))FI %IF (NOT (%*ISDEF(%nDisk))) THEN ( %SET(nDisk, 0) ) FI %IF (NOT (%*ISDEF(%nFloppy))) THEN ( %SET(nFloppy, 0) ) FI %IF (NOT (%*ISDEF(%nMemDisk))) THEN ( %SET(nMemDisk, 0) ) FI %IF (NOT (%*ISDEF(%nSCSI))) THEN ( %SET(nSCSI, 0) ) FI %SET(nDcb, %nDisk+%nFloppy+%nMemDisk+%nSCSI) %SET(nUpb, %nLucb+%nDisk) %SET(nScsiIob, %nIob+%nLucb) %SET(nVhb, %nDisk+%nFloppy+%nMemDisk) EVEN ; Space is always allocated since switch can be set at boot time ; (On protected mode OS's, the space is not significant and can ; be used for other useful purposes if fFsVerify is false.) PUBLIC wVerBuff, fFsVerify wVerBuff LABEL WORD DW 256 DUP (0) %IF (%fVerifyFileStruct) THEN ( fFsVerify DW 0FFFh )ELSE ( fFsVerify DW 0 )FI PUBLIC VerifyCode PUBLIC maskVerifyCode, maskFPIndex VerifyCode DW ? %IF (%fSrp) THEN ( maskVerifyCode DW 06000h maskFPIndex DW 01C00h ) ELSE( maskVerifyCode DW 7000h maskFPIndex DW 0 )FI PUBLIC exchAgent exchAgent DW 12 PUBLIC qbAllocateMax qbAllocateMax DW 0,%cSegAllocateMax PUBLIC sgNmbHeap,sNmbHeap,sNmbHeapFree,sNmbCompactionGoal sgNmbHeap DW 0; InitFs initializes sNmbHeap DW %cbNameSpace sNmbHeapFree DW %cbNameSpace sNmbCompactionGoal DW %cbNameCompactionGoal SegMartSeg SEGMENT PUBLIC 'Coed' signature DB 'MART' nSeg DW 4 rgSeg LABEL WORD sNmbSeg DW %cbNameSpace sFcb2Seg DW %nFcb*16 ; 32 per fcb. 16 in DGroup, 16 here. %IF(%fFabUfbOwnSeg) THEN ( %SET(sMpUserNumOUfbHead,256*2) %SET(sMpGroupOUfbHead,64*4) %SET(sRgUfb,%nFub*15) sUfbSeg DW %sMpUserNumOUfbHead+%sMpGroupOUfbHead+%sRgUfb sFabSeg DW 2+%nFab*10 ; 10 bytes per fab, 2 byte filler ) ELSE (%' No Fcb/Ufb/Fab segs needed sUfbSeg DW 0 sFabSeg DW 0 )FI SegMartSeg ENDS SegMartGroup GROUP SegMartSeg PUBLIC sgSegMart sgSegMart DW segMartSeg PUBLIC pFcb2, oFcb, sgFcb2 pFcb2 LABEL DWORD oFcb DW 0 sgFcb2 DW 0; InitFs initializes PUBLIC pMpGroupOUfbHead, sgUfbSeg, sgFabSeg %IF(%fFabUfbOwnSeg) THEN ( PUBLIC oMpGroupOUfbHead pMpGroupOUfbHead LABEL DWORD oMpGroupOUfbHead DW %sMpUserNumOUfbHead sgUfbSeg DW 0; InitFs initializes sgFabSeg DW 0; InitFs initializes EXTRN HfsUfb2: BYTE ; Ensure proper link. HfsUfb2 PUBLIC in HfsUfb2.obj HfsDummy DW HfsUfb2 ; Must reference it for Assembler to call for it. ) ELSE (%' Fabs, Ufbs in DGroup EXTRN HfsUfb: BYTE ; Ensure proper link. HfsUfb PUBLIC in HfsUfb.obj HfsDummy DW HfsUfb ; Must reference it for Assembler to call for it. pMpGroupOUfbHead DD 0 ; Should never be used sgUfbSeg DW DGroup sgFabSeg DW DGroup )FI%' NOT fFabUfbOwnSeg PUBLIC cDiskLogThreshold cDiskLogThreshold DW %cDiskLogThreshold Public pStat, pDiskStat, pCdt pStat DD ? pDiskStat DD ? pCdt DD ? ; ; The following is used by MassIo for Sector Scheduling ; EVEN Public rgSectMap rgSectMap label byte %If (%fFP) Then ( DB 0,4,8,12,16,20,24,28 DB 1,5,9,13,17,21,25,29 DB 2,6,10,14,18,22,26,30 DB 3,7,11,15,19,23,27,31 )FI %If (%fDP) Then ( DB 0,8,16,24,32,40,48,56 DB 2,10,18,26,34,42,50,58 DB 4,12,20,28,36,44,52,60 DB 6,14,22,30,38,46,54,62 ) FI )%' FileSystem $EJECT ; ; macro for defining MassIo dispatch routines ; %*DEFINE(MassIoInit (pInit)) ( %IF (%m_nRgMassIo EQ 0) THEN ( PUBLIC rgMassIoInit rgMassIoInit LABEL BYTE ) FI %SET (m_nRgMassIo, %m_nRgMassIo+1) %IF (%EQS(Dummy,%pInit)) THEN ( DD 0 ) ELSE ( %EXTRN(%pInit) DD %pInit ) FI ) %*DEFINE(MassIoDone) ( PUBLIC rgMassIoDisp, rgMassIoISR, rgMassIoWatchdog rgMassIoDisp DD %m_nRgMassIo DUP (0) rgMassIoISR DD %m_nRgMassIo DUP (0) rgMassIoWatchdog DD %m_nRgMassIo DUP (0) PUBLIC rgCreateDcb, rgEavesdropPassword, rgUpdateResourceName PUBLIC rgQueryDiskGeometry, rgSetDiskGeometry rgCreateDcb DD %m_nRgMassIo DUP (0) rgEavesdropPassword DD %m_nRgMassIo DUP (0) rgUpdateResourceName DD %m_nRgMassIo DUP (0) rgQueryDiskGeometry DD %m_nRgMassIo DUP (0) rgSetDiskGeometry DD %m_nRgMassIo DUP (0) ) $EJECT ; The next macro, DcbTemplate, defines device control blocks (DCB's) for devices ; controlled by the File System, ONLY. These include devices of the types ; described below which (conventionally) have the names indicated below. ; ; Floppy disks F0, F1, ... ; (either floppy or SCSI interfaces) ; Rigid disks D0, D1, ... ; (either SMD, ST-506 or SCSI interfaces) ; Memory disks M0, M1, ... ; Miscellaneous devices S0, S1, ... ; ; Note that SCSI devices (such as quarter-inch tape) that are NOT mass storage ; devices and hence not dispatched by MassIo DO NOT REQUIRE this kind of DCB. ; For compatability reasons with DoDirectRead/DoDirectWrite, sequential SCSI ; devices are assigned DCB's in the miscellaneous device category. rigidDisk EQU 0 floppyDisk EQU 1 memDisk EQU 2 miscDevice EQU 3 %*DEFINE(DcbTemplate(devFamily, "devName", "devPassword", retryLimit)) ( %SET(nDcbTemplate, %nDcbTemplate+1) %IF (%nDcbTemplate EQ 1) THEN ( %DEFINE(dcb)(0) ) FI %IF (%nDcbTemplate EQ 2) THEN ( %DEFINE(dcb)(1) ) FI %IF (%nDcbTemplate EQ 3) THEN ( %DEFINE(dcb)(2) ) FI %IF (%nDcbTemplate EQ 4) THEN ( %DEFINE(dcb)(3) ) FI %IF (%nDcbTemplate EQ 5) THEN ( %DEFINE(dcb)(4) ) FI %IF (%nDcbTemplate EQ 6) THEN ( %DEFINE(dcb)(5) ) FI %IF (%nDcbTemplate EQ 7) THEN ( %DEFINE(dcb)(6) ) FI %IF (%nDcbTemplate EQ 8) THEN ( %DEFINE(dcb)(7) ) FI %IF (%nDcbTemplate EQ 9) THEN ( %DEFINE(dcb)(8) ) FI %IF (%nDcbTemplate EQ 10) THEN ( %DEFINE(dcb)(9) ) FI %IF (%nDcbTemplate EQ 11) THEN ( %DEFINE(dcb)(10) ) FI %IF (%nDcbTemplate EQ 12) THEN ( %DEFINE(dcb)(11) ) FI %IF (%nDcbTemplate EQ 13) THEN ( %DEFINE(dcb)(12) ) FI %IF (%nDcbTemplate EQ 14) THEN ( %DEFINE(dcb)(13) ) FI %IF (%nDcbTemplate EQ 15) THEN ( %DEFINE(dcb)(14) ) FI %IF (%nDcbTemplate EQ 16) THEN ( %DEFINE(dcb)(15) ) FI %IF (%nDcbTemplate EQ 17) THEN ( %DEFINE(dcb)(16) ) FI %IF (%nDcbTemplate EQ 18) THEN ( %DEFINE(dcb)(17) ) FI %IF (%nDcbTemplate EQ 19) THEN ( %DEFINE(dcb)(18) ) FI %IF (%nDcbTemplate EQ 20) THEN ( %DEFINE(dcb)(19) ) FI %IF (%nDcbTemplate EQ 21) THEN ( %DEFINE(dcb)(20) ) FI %IF (%nDcbTemplate EQ 22) THEN ( %DEFINE(dcb)(21) ) FI %IF (%nDcbTemplate EQ 23) THEN ( %DEFINE(dcb)(22) ) FI %IF (%nDcbTemplate EQ 24) THEN ( %DEFINE(dcb)(23) ) FI %IF (%nDcbTemplate EQ 25) THEN ( %DEFINE(dcb)(24) ) FI %IF (%nDcbTemplate EQ 26) THEN ( %DEFINE(dcb)(25) ) FI %IF (%nDcbTemplate EQ 27) THEN ( %DEFINE(dcb)(26) ) FI %IF (%nDcbTemplate EQ 28) THEN ( %DEFINE(dcb)(27) ) FI %IF (%nDcbTemplate EQ 29) THEN ( %DEFINE(dcb)(28) ) FI %IF (%nDcbTemplate EQ 30) THEN ( %DEFINE(dcb)(29) ) FI %IF (%nDcbTemplate EQ 31) THEN ( %DEFINE(dcb)(30) ) FI %IF (%nDcbTemplate EQ 32) THEN ( %DEFINE(dcb)(31) ) FI %DEFINE(dcb%dcb)(dcb%dcb) dcb%dcb LABEL BYTE DB %devFamily %'deviceClass' DB 0 %'fUsed' DB %LEN(%devName),'%devName',12-%LEN(%devName) DUP (0) DB %LEN(%devPassword),'%devPassword',12-%LEN(%devPassword) DUP (0) DW %retryLimit %'retryLimit' ) $EJECT %*Define(SetScsiMgrVendorId("Vendor"))( %IF (%Len(%Vendor) NE 8) THEN ( %Error(ScsiMgrVendorId must be exactly 8 characters long) ) ELSE ( PUBLIC rgbScsiMgrVendorId rgbScsiMgrVendorId DB '%Vendor' )FI ) %*Define(SetScsiMgrProductId("Product"))( %IF (%Len(%Product) NE 16) THEN ( %Error(ScsiMgrProductId must be exactly 16 characters long) ) ELSE ( PUBLIC rgbScsiMgrProductId rgbScsiMgrProductId DB '%Product' )FI ) %*Define(SetScsiMgrVersion("Version"))( %IF (%Len(%Version) NE 4) THEN ( %Error(ScsiMgrVersion must be exactly 4 characters long) ) ELSE ( PUBLIC rgbScsiMgrVersion rgbScsiMgrVersion DB '%Version' )FI ) %*DEFINE (CreateGen)( EVEN PUBLIC gen ; SysGenType is def ined in CtosTypes.edf gen LABEL WORD DW 'JF' %IF (not(%*Isdef(%nUcb))) THEN (DW 0) ELSE (DW %nUcb) FI %IF (not(%*Isdef(%nPcb))) THEN (DW 0) ELSE (DW %nPcb) FI %IF (not(%*Isdef(%nUsrExchange))) THEN (DW 0) ELSE (DW %nUsrExchange) FI %IF (not(%*Isdef(%nMsgWait))) THEN (DW 0) ELSE (DW %nMsgWait) FI %IF (not(%*Isdef(%nPTiming))) THEN (DW 0) ELSE (DW %nPTiming) FI %IF (not(%*Isdef(%nSoftVec))) THEN (DW 0) ELSE (DW %nSoftVec) FI %IF (not(%*Isdef(%nIob))) THEN (DW 0) ELSE (DW %nIob) FI %IF (not(%*Isdef(%nFcb))) THEN (DW 0) ELSE (DW %nFcb) FI %IF (not(%*Isdef(%nFab))) THEN (DW 0) ELSE (DW %nFab) FI %IF (not(%*Isdef(%nDcb))) THEN (DW 0) ELSE (DW %nDcb) FI %IF (not(%*Isdef(%nVhb))) THEN (DW 0) ELSE (DW %nVhb) FI %IF (not(%*Isdef(%nMemDisk))) THEN (DW 0) ELSE (DW %nMemDisk) FI %IF (not(%*Isdef(%nFub))) THEN (DW 0) ELSE (DW %nFub) FI %IF (not(%*Isdef(%nScsiIob))) THEN (DW 0) ELSE (DW %nScsiIob) FI %IF (not(%*Isdef(%nLucb))) THEN (DW 0) ELSE (DW %nLucb) FI %IF (not(%*Isdef(%nUpb))) THEN (DW 0) ELSE (DW %nUpb) FI %IF (not(%*Isdef(%dcb0))) THEN (DD 0) ELSE (DD %dcb0) FI %IF (not(%*Isdef(%dcb1))) THEN (DD 0) ELSE (DD %dcb1) FI %IF (not(%*Isdef(%dcb2))) THEN (DD 0) ELSE (DD %dcb2) FI %IF (not(%*Isdef(%dcb3))) THEN (DD 0) ELSE (DD %dcb3) FI %IF (not(%*Isdef(%dcb4))) THEN (DD 0) ELSE (DD %dcb4) FI %IF (not(%*Isdef(%dcb5))) THEN (DD 0) ELSE (DD %dcb5) FI %IF (not(%*Isdef(%dcb6))) THEN (DD 0) ELSE (DD %dcb6) FI %IF (not(%*Isdef(%dcb7))) THEN (DD 0) ELSE (DD %dcb7) FI %IF (not(%*Isdef(%dcb8))) THEN (DD 0) ELSE (DD %dcb8) FI %IF (not(%*Isdef(%dcb9))) THEN (DD 0) ELSE (DD %dcb9) FI %IF (not(%*Isdef(%dcb10))) THEN (DD 0) ELSE (DD %dcb10) FI %IF (not(%*Isdef(%dcb11))) THEN (DD 0) ELSE (DD %dcb11) FI %IF (not(%*Isdef(%dcb12))) THEN (DD 0) ELSE (DD %dcb12) FI %IF (not(%*Isdef(%dcb13))) THEN (DD 0) ELSE (DD %dcb13) FI %IF (not(%*Isdef(%dcb14))) THEN (DD 0) ELSE (DD %dcb14) FI %IF (not(%*Isdef(%dcb15))) THEN (DD 0) ELSE (DD %dcb15) FI %IF (not(%*Isdef(%dcb16))) THEN (DD 0) ELSE (DD %dcb16) FI %IF (not(%*Isdef(%dcb17))) THEN (DD 0) ELSE (DD %dcb17) FI %IF (not(%*Isdef(%dcb18))) THEN (DD 0) ELSE (DD %dcb18) FI %IF (not(%*Isdef(%dcb19))) THEN (DD 0) ELSE (DD %dcb19) FI %IF (not(%*Isdef(%dcb20))) THEN (DD 0) ELSE (DD %dcb20) FI %IF (not(%*Isdef(%dcb21))) THEN (DD 0) ELSE (DD %dcb21) FI %IF (not(%*Isdef(%dcb22))) THEN (DD 0) ELSE (DD %dcb22) FI %IF (not(%*Isdef(%dcb23))) THEN (DD 0) ELSE (DD %dcb23) FI %IF (not(%*Isdef(%dcb24))) THEN (DD 0) ELSE (DD %dcb24) FI %IF (not(%*Isdef(%dcb25))) THEN (DD 0) ELSE (DD %dcb25) FI %IF (not(%*Isdef(%dcb26))) THEN (DD 0) ELSE (DD %dcb26) FI %IF (not(%*Isdef(%dcb27))) THEN (DD 0) ELSE (DD %dcb27) FI %IF (not(%*Isdef(%dcb28))) THEN (DD 0) ELSE (DD %dcb28) FI %IF (not(%*Isdef(%dcb29))) THEN (DD 0) ELSE (DD %dcb29) FI %IF (not(%*Isdef(%dcb30))) THEN (DD 0) ELSE (DD %dcb30) FI %IF (not(%*Isdef(%dcb31))) THEN (DD 0) ELSE (DD %dcb31) FI DD 0 ; End-sentinel for Initfs(AssignDcb) ) %*DEFINE (Final)( %IF (%m_nInitProcHardware EQ 0) THEN (rgInitProcHardware label byte) FI %IF (%m_nInitProcIntDisable EQ 0) THEN (rgInitProcIntDisable label byte) FI %IF (%m_nInitProcIntEnable EQ 0) THEN (rgInitProcIntEnable label byte) FI %IF (%m_nSystemCommonInstall EQ 0)THEN (rgSystemCommonInstall label byte) FI %IF (%m_nSetIntHandler EQ 0) THEN (rgSetIntHandler label byte) FI %IF (%m_nOsProcDesc EQ 0) THEN (rgOsProcDesc label byte) FI %IF (%m_nRgInitRtcRequest EQ 0) THEN(rgInitRtcRequest label byte) FI EVEN nRgInitRtcRequest DW %m_nRgInitRtcRequest nInitProcHardware DW %m_nInitProcHardware nInitProcIntDisable DW %m_nInitProcIntDisable nInitProcIntEnable DW %m_nInitProcIntEnable nSystemCommonInstall DW %m_nSystemCommonInstall nSetIntHandler DW %m_nSetIntHandler nOsProcDesc DW %m_nOsProcDesc %IF (%FS) THEN (%' PUBLIC nRgMassIo nRgMassIo DW %m_nRgMassIo PUBLIC initSysDevNum initSysDevNum DW %IF (%*IsDef(%SysDevNum)) THEN (%SysDevNum) ELSE (0FFFFh)FI )FI data ENDS END ); end macro Final Template EQ 30) THEN ( %DEFINE(dcb)(29) ) FI %IF (%nDcbTemplate EQ 31) THEN ( %DEFINE(dcb)(30) ) FI %IF (%nDcbTemplate EQ 32) THEN ( %DEFINE(dcb ; CTOS III 1.0 ; ; COPYRIGHT 1986, 1987, 1988, 1989, 1990 CONVERGENT TECHNOLOGIES, INC. ALL ; RIGHTS RESERVED ; ; COPYRIGHT 1980, 1989, 1990, 1991, 1992 UNISYS CORPORATION. ; ALL RIGHTS RESERVED. ; UNISYS PROPRIETARY ; ; THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE ; OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE, AND MAY NOT BE ; COPIED OR OTHERWISE USED WITHOUT THE PRIOR WRITTEN CONSENT OF CONVERGENT ; TECHNOLOGIES, INC. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS ; SOURCE CODE, SHALL AT ALL TIMES REMAIN IN CONVERGENT TECHNOLOGIES. ; ; ; 2/8/84, 4:20 pm. Vinay - added definitions for multibus ; adapter data structure space. ; Flag is "nAdapters", default 1. ; 1/10/86 JA Merge MF ; 2/6/86 JA remove rgPTBuffers ; 3/3/86 JM Swap Fabs ; 3/17/86 MS add sarCurrent to GraphicsInfo ; 3/19/86 MS add userNumVdm to GraphicsInfo ; 3/21/86 JM fLfsToMaster ; 4/15/86 DR CTOSp and fProtected ; 4/25/86 FW NewGen support. ; 5/16/86 JM sbSwapFileFirst configurable ; 5/21/86 JM vfForkUser ; 5/27/86 JM rgCannotOpenSwapFile ; 5/31/86 JA removed vfForkUser ; 6/11/86 JM COED dcbSeg ; ; 8/25/86 JA FS version ; 9/23/86 DR CTOS II 2.0 merge ; 11/3/86 RLM add orgClusterTerm array ; 12/1/86 JA add rgModDesc, iModDescMax, macro XbusWindowSize ; also qbAllocateMax ; 12/9/86 JA remove iobuf ; 1/8/86 JA DisplayConfig.run. ; 1/22/87 JA cSegAllocateMax ; 3/9/87 KEB changed version to 11.1 ; 3/5/87 JM orgAsib in SysConfigBlock ; 3/6/87 JM add UBuf segment ; 3/13/87 KEB added OEMn.run to execute before sysinit.run ; 3/24/87 MDE,JM add OEMSeg ; 5/8/87 RLM configure timeout counters for master os's. ; 5/13/87 FVW increase maxMedInterruptType by 1 to prevent intSwTbl from ; clobbering the XbusIdtable which follows it. (for 2.1) ; 8/11/87 FVW Make sure wVerBuff is on an even word boundary. ; 10/15/87 JA add rgsgAsib, remove rgAsib,rgArib, all tibs. ; 10/27/87 JM RequestNoRemoteTermination macro. ; 11/17/87 JA public userNumNetMin/Max. ; 12/21/87 SAR unconditionally allocate wVerBuff space (512 bytes) ; 12/21/87 SAR added cDiskLogThreshold ; 1/23/88 JA merge with Srp 1.4 - ; 5/28/87 JA rgTermTable ; 8/13/87 JM statistics for fabs ; 8/26/87 JM/JA rgTermTable biggered for Net users. ; 9/30/87 JA public userNumNetMin/Max for Srp ; 1/25/88 JA add pStat,pDiskStat,pCdt for all MF ; 2/1/88 JA Remove fCheckRequestBlockConsistency to kernel. Add fSrpUp. ; 2/2/88 JA Public rgUserWaitCount, f386. ; 2/4/88 JA fProtected public. ; 2/8/88 JA cpuType public, and in Config. nSwapFabs default 0. ; 2/15/88 JA more Srp stuff public for WS. ; 2/16/88 JA remove cpuType, fix FS publics. ; 2/22/88 JA rgbBufLeds sysgenable size. ; 2/25/88 JA rgExchReal contains bytes for Srp too. ; 2/29/88 JM add rgUSeg stuff ; 3/21/88 JA remove netrouting; add iMySlot. ; 04/05/88 JM change macro XbusWindowSize to DefineXbusModule, add fMode3 ; param. ; 04/05/88 DR add pRgSgLdt - for sgLDT to user num mapping ; 04/05/88 DR add pRgSwapMode - per partition swap modes ; 04/13/88 RLM make xblockheader 32 bytes ; 04/20/88 JM remove rgUcb, rgoUcb - now created in own segment during init. ; 05/02/88 MTR add sSwapMap, sMemMap--export *Map ; 07/15/88 JA pFPMasterMountTable made into pa ; 08/05/88 JA 386 srp ; 08/23/88 BF OS process names ; 08/22/88 JA InterruptMask macro. ; 08/24/88 JM solder gh list together correctly. ; 09/06/88 JA mask8259A,cascade8259A are words. ; 09/07/88 MTR maps out of DGroup & dynamically allocated, ; SCB oRgOUcbObsolete<-oPRgOUcb, oRgOExUcb<-oPRgOExUcb ; 09/23/88 MTR sys exch names ; 10/31/88 MTR allocate ucbSeg & exUcbSeg, initialized post-boot ; 10/31/88 KH tyCoprocessor and tyRedirect ; 11/09/88 JA/KH mask8259aA, cascade8259A are moved to Data_all.asm ; 11/11/88 AT added paConfigFile, cbConfigFile, bBoardsNotReady in Cdt, ; removed termTable, lineTable, fMasterReady. ; 11/17/88 MTR add DbgGroup (for rgOSProcName, et al) & debl macro ; 11/19/88 JA/RLM mouseData for MF too. ; 12/16/88 PGJ Entries in 'mptyDevMask' 12 bytes long (new 'cMask' field) ; 01/89/89 RLM use GP SI AND CI for 386 srp. ; 01/30/89 JA cdt.userNumMax. ; 02/16/89 AT cPagesMBusWindow. ; 04/05/89 JA/RLM nTicks = 4. No more lineHZ. ; 04/18/89 AT BootDebugToken, BootDumpToken ; 05/10/89 JA add publics for W blocks. ; 05/19/89 AT replace fFiller with bDumpCommand in cdt. ; 06/05/89 JMR added userNumChannelE to H for CI for rgcommline ; 06/08/89 JA add fWashDisable, rgObit to cdt ; 06/09/89 JA cPagesMBusWindow -> cMegabytesOtherBoardMax in prefix file. ; add tyXINTR0,tyXINTR1,tyHINTR71,tyXINTR3,tyXINTR4,tyHINTR87. ; 07/06/89 JAY declared WS (pMstr/pStnd) publics: sStat, sIccStat, sProcStat, ; sDiskStat, sExchStat, pIccStat, pProcStat, pExchStat. ; 07/21/89 AT fGP, fCI and fSI are always the same for OS. ; fNoFileSystem no longer public so it won't get used. ; HACK for maxDevMounted so mount table is big enough. ; 07/28/89 AT Removed BootDebugToken, BootDumpToken.  ; 08/03/89 AT Added nRkvsUsers. ; 08/15/89 AT userNumNetMin/Max initially slot 37. ; 08/20/89 AT word align paConfigFile, cbConfigFile in CDT ; 08/22/89 JM obsolete scb.nParDesc, scb.oprgoUcb, scb.oPrgoExUcb; ; re-implement scb.bMasterFpCpuId, scb.bMySlot, ; scb.bMasterCpCpuId ; 08/22/89 AT obsolete bMyLine. Slight fixes for JM changes above. ; 08/24/89 BF DbgGroup into OSNamePlace ; 09/01/89 AT Change of 08/20/89 was lost in merging, re-instated. ; 09/27/89 JA  Add optional UfbSeg, FabSeg. ; 09/29/89 MTR rgSbWsUserName now alloc'd by InitClstr, dummy labels retained ; 09/??/89 ??? Add rgUpdateResourceName. ; 10/05/89 JA/mtr Cdt sDeviceHandle is 6 ; 10/09/89 JA Out(hfsUfb msg) CRLF. ; 10/11/89 DHG Updated Stat1 tables for statistics. ; 10/13/89 JMR changed TpInHdrs from 10 to 12. ; 10/17/89 JMR Added default port macro ; 11/14/89 MTR Add fileSystemPriority ; 11/18/89 MTR FabSeg needs 2 more bytes to be right size! (fix GP fault). ; Allow fFabUfbOwnSeg to be set in prefix file ; 11/30/89 AT Add nSequentialDevicesMax, sgSequentialDcbSeg ; 12/06/89 JA removed remoteDma tables. ; 12/07/89 PGJ/ja Changed GenDcb to DcbTemplate. ; 12/08/89 AT Use cMegabytesOtherBoardMax correctly. ; 12/08/89 RLM/AT nRkvsUsers default is 2. ; 01/09/90 AT Use nXBlk, sXBlk etc. ; 01/09/90 JA cdt.sHandleTable -> cdt.nDeviceHandles. ; 01/10/90 MTR Add nDmaIob ; 01/11/90 AT sXBlkHeader and sXBlkRqMax in pClstr and pClstrLfs. ; Make FS and OS config block the same up to bMasterCpCpuId. ; 01/15/90 AT rgSbWsUserName in DGroup for non-cluster SRP boards. ; Removed f(Sub)SysChannelA/B/C/D, only used in SinglePartition. ; 01/15/90 SAH added rgbExtDumpMsg, cbExtDumpMsg, rgbScsiMgrVendorId, ; rgbScsiMgrProductId, rgbScsiMgrVersionId, ; strings for Init_P and Fault_P ; 01/18/90 JAY fGpBootTapeLoader/fGpBootTapeSysgen. ; 01/18/90 JA xblock header size back to 32 for ctosp. ; 02/05/90 JM add library search path macro, sEnvironment, sLoaderHeap. ; obolsete cpUSegs. ; 03/02/90 JC added following BTOS mods: ; File Locking Support, Name Space in separate group ; Hardware Id support. KbdTimer support ; 03/09/90 KH add sbNlsKbdFileSpec, sbNlsKbdPassword ; 03/23/90 JA strip cluster data out; its in Data_*.asm. Add agentParams. ; 03/23/90 JA strip T0 support; add fClPoll, ClPollTimer. ; 03/21/90 JM add exchQuiet. merge: ; 02/07/90 JA add exchPit. ; 04/01/90 JC Added allocated user number support for IDM, ; B28-EXP support, fClstrLineSecure definition ; 04/26/90 JC Added allocated user number variables to AgentParams ; Additionally, made these work only on W/S, not SRP ; 6/12/90 JMR Fix rgcommline broken structure ; 6/20/90 RR Merged LDM code ; 06/29/90 JM set sExUcb for ctosv and ctosp. ; 07/05/90 JC Removed definition for ExchHwId, using built-in now ; 07/06/90 JA Added cPitTicksPollIntervalMax to AgentParams. ; 07/06/90 JC Added statistics support ; 07/06/90 JMR updated rgcommline ; 07/10/90 DR oPRgOExUcb ; 07/18/90 JMR rgcommline grows ; 07/21/90 MTR add SegMart, use for LDM structures ; 07/30/90 GWH InterruptMask changes for External 8259 on SuperGen. ; 08/08/90 JC Removed fClstrLineSecure (deimplemented) ; 08/20/90 JM trbGinfoSet is ctosv only. ; 08/30/90 JA Remove FS/SI stuff to SysGen_Common.mdf. ; 09/20/90 KH Add rgbBufIOaddr (parallel to rgbBufLeds) ; 09/28/90 AT Add rgbXBusTimeout. ; 10/13/90 AT Merge InterruptMask and HardwareInterrupt macros/tables. ; 11/26/90 JC Added battery clock invalid message from BTOS ; Changed fRebootClstr field in agentparams to DWORD entry, ; 03/11/91 JA Move wMySlotBits,iMySlot to Data_all. ; 04/04/91 JF Set nDct to WsTotal insttead of 24 if not fSrp ; 04/03/91 AT Add rgbDefaultInt. ; 04/13/91 KH WS###>NLSxxx ; 05/13/91 AT HardwareInterrupt takes bAttributes, not fEnable. ; 05/29/91 AT nOutstandingMax default is 5. ; 07/22/91 JM increase size of LargeMap and MemMap in v-series. ; 09/03/91 JM  increase size of LargeMap and MemMap in v-series. ; 10/18/91 AM modifications for nNetUsers as a parameter in Config.Sys. ; also defined ExUcbLast based on nUcbs, not nUserNum ; 02/26/92 sg Add HINTR71 for OEM ; 03/18/92 JM remove padding from sbNls*Spec. remove uBuf from v. ; 06/05/92 JM obsolete largeMap, swapMap, stoneMap. bigger memMap. ; 07/01/92 FW Add "No ClientCard ..." text string. Fix copyright notice. ; 11/05/92 RA Use space in rgCommLine to indicate if hardware type is pcAT. ; 11/06/92 JF Simplify allocated user numbers so that structures are ; allocated by init code. ; 11/12/92 JF Remove rgWakeUpRq. Remove NameCommon. Remove all structures ; that depend on nPartitions: rgUserReadCount, ; rgUserWaitCount, ContextStatus, contextState, rgcRq, ; rgDeltaPriority. Permit file system parameters to be ; specified here to override file system. ; 01/20/93 JA Pc version. ; 02/17/93 KK Added hwIDCMOSAddr, hwIDCMOSChecksum, and fChecksumCMOSHwID ;  so that the CMOS Hardware ID Address can be customized. ; 02/29/93 SE Allocate space for nSequentialDevicesMax/sgSequentialDcbSeg ; 03/03/93 RA ServerComm. Extend rgCommline, extend the rgDmaAddr ; structure, the 82370 DMA controller needs the ; RequesterAddress also to be programmed. *AA* ; 03/18/93 JA Remove unreferenced strings. ; 03/22/93 RA Sg4000/6000. ; 03/26/93 JF Add fAgentCache, fAgentCacheDefaultEnable to AgentParams ; 03/29/93 JA sYblk default 4160 (4k+64) ; 04/01/93  JF Add pfEnableCluster to AgentParams ; 04/04/93 RA rgDmaAddr changes again, for Sg4k/6k ecom/tdi. The mask, ; mode, clrBytePtr, cmd regs are different for rx and tx. *AA* ; 04/07/93 sg add IOP types to rgbtypetable. ; 05/12/93 JA fHighSpeed default 1(1.8m) instead of 0(307k). ; 05/14/93 JM move rgTermTable out of dgroup. ; move Stat2, Stat3, Stat4 out of dgroup. ; 05/18/93 sg define psDiskStat, psProcStat, psExchStat for dgroup access. ; 06/02/93 SE sbVersion initialized to zeros ; 06/07/93 JA nZ/Y/WblkLocal ; 06/09/93 JA sZ/Y/WblkLocal ; 06/14/93 JA/sg change defaults for Y/Wblk ; 06/15/93 RA Change nCommline to 4 for ISDN. *AA* ; 06/21/93 JF Add prgRqNoRemoteTermination and nRqNoRemoteTerm to AgentParams ; 06/26/93 JM add pnProcTick. ; 06/30/93 SE Report too many user numbers. ; 06/15/93 JA updated stat1 for local blocks, nIob->revision ; 06/23/93 JA FilterProcessExch out of agentParams. ; 07/01/93 JA Expunge periodic. Dummy snWYZBlkLocal for non-srp. ; 07/12/93 JM nWsUsers = nUserNum - nUcb ; 07/27/93 JA Expunge nProcTick, use pProcStat instead. Expunge pIccStat. ; Expunge psProcStat, psExchStat, psDiskStat. ; 08/10/93 JA Expunge rgbBufOut, ibBufOutPut/Take, fBufOutOverflow. %IF (not(%*Isdef(%fSrp))) THEN (%Define(fSrp)(0))FI %IF (not(%*Isdef(%CTOSp))) THEN (%Define(CTOSp)(0ffh))FI %IF (not(%*Isdef(%fMulPar))) THEN (%Define(fMulPar)(0ffh))FI %IF (not(%*Isdef(%fVarPar))) THEN (%Define(fVarPar)(0ffh))FI %IF (not(%*Isdef(%ctosv))) THEN (%Define(ctosv)(0))FI %IF (not(%*Isdef(%Bsac))) THEN (%Define(Bsac)(0))FI %IF (not(%*Isdef(%Statistics))) THEN (%Define(Statistics)(0FFh))FI %IF (not(%*Isdef(%OSVersion))) THEN ( %IF (%ctosv) THEN ( %Define(OSVersion)(0D01h) )ELSE( %Define(OSVersion)(0C03h) )FI %IF (not(%*Isdef(%fForceSlotBits))) THEN (%Define(fForceSlotBits)(0))FI )FI %Define(FS)(0) $INCLUDE(Sysgen_Common.mdf) ; Size of intSwtbl entries %if(%ctosp)then( cwIntSwtblEntry equ 0 )else( cwIntSwtblEntry equ 3 )fi %Define(fFP)(0) %Define(fTP)(0) %Define(fCP)(0) %Define(fSP)(0) %Define(fDP)(0) %Define(fBT)(0) %Define(fGP)(0) %IF (%WsType LE awsMaster) THEN (%Error(Unsupported wsType %wsType!)) ELSE(%IF (%WsType LE ngenMaster) THEN (%Define(fNGenHardware)(0FFH)) ELSE( %Define(fSrp)(0FFH) %IF (%WsType EQ FpType) THEN (%Define(fFP)(0FFH))FI %IF (%WsType EQ TpType) THEN (%Define(fTP)(0FFH))FI %IF (%WsType EQ CpType) THEN (%Define(fCP)(0FFH))FI %IF (%WsType EQ SpType) THEN (%Define(fSP)(0FFH))FI %IF (%WsType EQ DpType) THEN (%Define(fDP)(0FFH))FI %IF (%WsType EQ BtType) THEN (%Define(fBT)(0FFH))FI %IF (%WsType EQ GpType) THEN (%Define(fGP)(0FFH))FI )FI)FI ; initialize counters and flags ; %IF (not(%*Isdef(%nIOPermissionBits))) THEN (%Define(nIOPermissionBits)(0))FI %IF (not(%*Isdef(%cParSCHeap))) THEN (%Define(cParSCHeap)(16))FI %IF (not(%*Isdef(%fDebugger))) THEN (%Define(fDebugger)(1))FI %IF (not(%*Isdef(%localFS))) THEN (%Define(localFS)(0))FI %IF (not(%*Isdef(%fontRamBuf))) THEN (%Define(fontRambuf)(0))FI %IF (not(%*Isdef(%fMulPar))) THEN (%Define(fMulPar)(0))FI %IF (not(%*Isdef(%fVarPar))) THEN (%Define(fVarPar)(0))FI %IF (not(%*Isdef(%fFloppyCheck))) THEN (%Define(fFloppyCheck)(0))FI %IF (not(%*Isdef(%nRkvsUsers))) THEN (%Define(nRkvsUsers)(2))FI %IF (not(%*Isdef(%nUserNum))) THEN (%Define(nUserNum)(%nUcb))FI %IF (%nUserNum GE 1023) THEN (%Error(Too many user numbers defined. Maximum allowable value is 1023.))FI %IF (not(%*Isdef(%nNetUsers))) THEN (%Define(nNetUsers)(0))FI %IF (not(%*Isdef(%hwIdCMOSAddr))) THEN (%Define(hwIdCMOSAddr)(60h))FI %I F (not(%*Isdef(%hwIdCMOSChecksumAddr))) THEN ( %Define(hwIdCMOSChecksumAddr)(61h))FI %IF (not(%*Isdef(%fChecksumCMOSHwId))) THEN ( %Define(fChecksumCMOSHwId)(0FFh))FI %IF (not(%*Isdef(%nSoftVec))) THEN (%Define(nSoftVec)(30+3*%nUcb))FI %IF (not(%*Isdef(%nPartitions))) THEN (%Define(nPartitions)(1))FI %IF (not(%*Isdef(%nPartitionsMax))) THEN (%Define(nPartitionsMax)(96))FI %IF (%nPartitions GT %nPartitionsMax) THEN ( %SET (nPartitions, %nPartitionsMax))FI %IF (not(%*Isdef(%nDmaIob))) THEN ( %IF (%fSrp) THEN ( %Define(nDmaIob)(64) ) ELSE ( %Define(nDmaIob)(0) )FI )FI %If (Not(%*Isdef(%nRcb))) Then (%Define(nRcb)(50))FI %IF (not(%*Isdef(%clusterTimeout))) THEN ( %IF(%fSrp) THEN (%Define(clusterTimeout)(30)) ELSE (%Define(clusterTimeout)(10))FI )FI %IF (%clusterTimeout LT 2) THEN (%Define(clusterTimeout)(2))FI %Define(nRepollActive)(0) %IF (not(%*Isdef(%fSpecialFullyNestedMode))) THEN (%Define(fSpecialFullyNestedMode)(0FFh))FI %IF (not(%*Isdef(%wsTotal))) THEN ( %IF (%clusterConfig EQ 2) THEN (%Define(wsTotal)(1)) ELSE (%Define(wsTotal)(0))FI )FI %IF (not(%*Isdef(%nWsLine1))) THEN (%Define(nWsLine1)(%wsTotal))FI %IF (not(%*Isdef(%nWsLine2))) THEN (%Define(nWsLine2)(0))FI %IF (not(%*Isdef(%nXBlkSmall))) THEN (%Define(nXBlkSmall)(0))FI %IF (not(%*Isdef(%sXBlkSmall))) THEN (%Define(sXBlkSmall)(0))FI %IF (not(%*Isdef(%nXBlk))) THEN (%Define(nXBlk)(0))FI %IF (not(%*Isdef(%sXBlk))) THEN (%Define(sXBlk)(0))FI %SET(nWsUserNum, %nUserNum-%nPartitions) %IF (%nWsUserNum EQ 0) THEN (%Define(nWsUserNum)(1))Fi %IF (not(%*Isdef(%fKbdRes))) THEN (%Define(fKbdRes)(0FFh))FI %IF (not(%*Isdef(%sParExitRunFile))) THEN (%Define(sParExitRunFile)(3200))FI %Define(nAsib)(%nUcb) %IF (not(%*Isdef(%nArib))) THEN (%Define(nArib)(%nAsib))FI %IF (%ctosv) THEN ( %IF (not(%*Isdef(%cMemMapSlots))) THEN (%Define(cMemMapSlots)(%nPartitions*16))FI )ELSE( %IF (not(%*Isdef(%cLargeMapSlots))) THEN (%Define(cLargeMapSlots)(60))FI %IF (not(%*Isdef(%cMemMapSlots))) THEN (%Define(cMemMapSlots)(60))FI %IF (not(%*Isdef(%cStoneMapSlots))) THEN (%Define(cStoneMapSlots)(60))FI %IF (not(%*Isdef(%cSwapMapSlots))) THEN (%Define(cSwapMapSlots)(75))FI )FI %IF (%fGP) THEN ( %IF (not(%*IsDef(%cMegabytesOtherBoardMax))) THEN (%Define(cMegabytesOtherBoardMax)(64))FI )FI %IF (not(%*Isdef(%fCheckMem))) THEN (%Define(fCheckMem)(0))FI %IF (not(%*Isdef(%fCheckEcc))) THEN (%Define(fCheckEcc)(0))FI %IF (not(%*Isdef(%nSwapFabs))) THEN ( %IF(%ctosp) THEN (%Define(nSwapFabs)(32)) ELSE (%Define(nSwapFabs)(0))FI )FI %IF (not(%*Isdef(%nUsrExchange))) THEN (%Define(nUsrExchange)(20))FI %IF (not(%*Isdef(%nPTiming))) THEN (%Define(nPTiming)(20))FI %IF (%ctosp) THEN ( %IF (not(%*Isdef(%nKbdTimers))) THEN (%Define(nKbdTimers)(4))FI )FI %IF(NOT(%*ISDEF(%fWrappedDebugger))) THEN (%DEFINE(fWrappedDebugger)(0))FI %IF (not(%*Isdef(%sEnvironment))) THEN ( %IF (%ctosv) THEN ( %Define(sEnvironment)(1024) )ELSE( %Define(sEnvironment)(0) )FI )FI %IF (%fSrp) THEN ( %If (Not(%*Isdef(%sOutBuffer))) Then (%Define(sOutBuffer)(128))FI %If (Not(%*Isdef(%sStatArea))) Then (%Define(sStatArea)(4))FI %If (Not(%*Isdef(%nRcb))) Then (%Define(nRcb)(40))FI %If (Not(%*Isdef(%nWblk))) Then (%Define(nWblk)(2))FI %If (Not(%*Isdef(%sWblk))) Then (%Define(sWblk)(65500))FI %If (Not(%*Isdef(%nYblk))) Then (%Define(nYblk)(25))FI %If (Not(%*Isdef(%sYblk))) Then (%Define(sYblk)(4160))FI %If (Not(%*Isdef(%nZblk))) Then (%Define(nZblk)(150))FI %If (Not(%*Isdef(%sZblk))) Then (%Define(sZblk)(180))FI %If (Not(%*IsDef(%nMountedDisks))) Then (%Define(nMountedDisks)(10))Fi %If (Not(%*IsDef(%nFixup))) Then (%Define(nFixup)(100))Fi %If (Not(%*IsDef(%nDeviceHandle))) Then (%Define(nDeviceHandle)(200))Fi %If (Not(%*IsDef(%sBroadcastHeap))) Then (%Define(sBroadcastHeap)(1024))Fi %If (Not(%*IsDef(%fGpBootTapeLoader))) Then (%Define(fGpBootTapeLoader)(0))Fi ; The 80 (below) is the size of the output ring buffer for each t0 window ; If the serial ports are not going to be used, the size for windows 4 and 6 ; can be made smaller, but all windows need to be a multiple of 16 %If (%fTP) Then ( %If (Not(%*IsDef(%sTpInBuf))) THEN (%Define(sTpInBuf)(128))FI %If (Not(%*IsDef(%sTpOutBuf))) THEN (%Define(sTpOutBuf)(128))FI ) FI )FI %' fSrp %If (Not(%*Isdef(%sZblk))) Then (%Define(sZblk)(0))FI%' For Sysgen.asm comment %if(%ctosp)then( %SET (m_nSoftwareInt, 0) )else( %SET (m_nRawInt, 0) %SET (m_nMediatedInt, 0) )fi %SET (m_ErrorCount, 0) %SET (m_ExchLast, 1) %SET (m_SysExch, 1) %SET (m_iModDescMax, 0) %SET (m_oSbExchLast, 0) %IF(%fVarpar) THEN ( EXTRN ResumeTask:FAR )FI ;**************************************************************************** ; Variables common to all Operating Systems and all FileSystems ;**************************************************************************** OEMSeg SEGMENT PARA PUBLIC 'OEMSeg' PUBLIC rgbOemSeg ; A pointer to this segment (the 32 byte OEM space) is returned ; by GetpStructure (case 37). rgbOemSeg DB 32 DUP (0) %IF(%Statistics) THEN ( PUBLIC rgpStatistics rgpStatistics DD DGroup:TaskSwitch DD DGroup:IntTaskSwitch DD DGroup:IdleProcessCycles )FI OEMSeg ENDS %IF (%ctosv) THEN ( PUBLIC sgMax, cSgWindowableVioMax, csgPmMax GInfoSeg SEGMENT PUBLIC 'OEMSeg' ; GInfoSeg is an OS/2 structure used by PM. The Timer process maintains it. DB 25 DUP(0) sgMax LABEL BYTE DB %nUserNum ;sgMax can be updated by InitAllocUsers DB 44 DUP(0) cSgWindowableVioMax LABEL BYTE DB %nUserNum ;cSgWindowableVioMax can be updated by InitAllocUsers csgPmMax LABEL BYTE DB %nUserNum ;csgPmMax can be updated by InitAllocUsers GInfoSeg ENDS )FI %define(sUcb)(95) UcbSeg SEGMENT PARA PUBLIC 'OEMSeg' rgOUcb DW 0 ;Segment gets created in lowmem by InitLowMemStructSeg UcbSeg ENDS %define(sExUcb)(11) ExUcbSeg SEGMENT PARA PUBLIC 'OEMSeg' rgOExUcb DW 0 ;Segment gets created in lowmem by InitLowMemStructSeg ExUcbSeg ENDS const SEGMENT PUBLIC 'const' const ENDS data SEGMENT PUBLIC 'data' DGroup GROUP Const, Data %IF(%Statistics) THEN ( PUBLIC TaskSwitch, IntTaskSwitch, IdleProcessCycles )FI ; System configuration block ; The following variables must be in order: EVEN PUBLIC Config, wsType, osType, nPcb, nExchg, nMsgWait PUBLIC hardwareType, clusterConfig, fCommIop, fMulpar PUBLIC saSemiLowest, saSemiHighest, saTempLowest, saTempHighest, saEndMemory PUBLIC nIob, nFcb, nFub ; Init code sets these in config block for FS to see. PUBLIC nPTiming, nUcb PUBLIC fLfsToMaster, vfAllowDirSlashes Public bMySlot, fMasterFp PUBLIC sbOsNameClstr, sbOsNameClstrLfs, sbOsNameStnd, sbOsNameSrvr, sbVersion PUBLIC cbOsNameMax ; Default OsNames can be overridden by config.sys, e.g., :OsNameClstr: cbOsNameMax DB 20 ;Max size of OsName sbOsNameClstr DB 6,'vClstr ' ;must allow cbOsNameMax char sbOsNameClstrLfs DB 9,'vClstrLfs ' ;must allow cbOsNameMax char sbOsNameSrvr DB 5,'vSrvr ' ;must allow cbOsNameMax char sbOsNameStnd DB 5,'vStnd ' ;must allow cbOsNameMax char ; The final version name is created here, and pVersionNo is set to point to it. sbVersion DB 50 DUP(0) Config LABEL WORD wsType DB %wsType osType DB 1 ;Resident, not swapping saSemiLowest DW 0 %if(not %ctosp)then( PUBLIC plaMemMin plaMemMin label word )fi saSemiHighest DW 0 saTempLowest DW 0 %if(not %ctosp)then( PUBLIC plaMemMax plaMemMax label word )fi saTempHighest DW 0 %if(not %ctosp)then( PUBLIC plaEndMemory plaEndMemory label word )fi saEndMemory DW 0 nPcb DW %nPcb nExchg DW ? nMsgWait DW %nMsgWait vfAllowDirSlashes DB %FALSE fLfsToMaster DB %FALSE nPTiming DW %nPTiming nIob DW 0 nFcb DW 0 nVhb DW 0 nUcb DW %nUcb nFub DW 0 hardwareType DB %hardwareType clusterConfig DB %clusterConfig fNoFileSystem DB %fNoFileSystem fCommIop DB %fCommIop fMulpar DB %IF(%fVarPar) THEN (3) ELSE (%IF(%fMulpar) THEN (0FFh) ELSE (0)FI)FI fMasterFP DB 0 PUBLIC bMasterFpCpuId bMasterFpCpuId Db ? ; Not used in FS, just for compatibility. bMySlot Db ? PUBLIC bMasterCpCpuId bMasterCpCpuId Db ? ; OS only part (not in wrapped images) fillCompat DB 1 DUP(?) public oPRgOExUcb oPRgOExUcb dw DGroup:pRgOExUcb ; These two userNums are a structure. They are in sysConfig so that the installable video system service can access them. PUBLIC userNumKbd, userNumVid userNumVid DW 2 userNumKbd DW 2 PUBLIC orgPcb oRgPcb DW 0 PUBLIC oRgUserReadCount, oRgUserWaitCount oRgUserReadCount DW ? ;Used by InitVam, set by KernelSetup oRgUserWaitCount DW ? ;Used by InitVam, set by KernelSetup fill DW 3 DUP(0) ;keeps orgsgAsib below aligned %IF(%fVarpar) THEN ( DW DGROUP:rgsgAsib ; used by debugger, debugfile DW 0 ; was sAsib, now obsolete DD ResumeTask ; used by debugfile )FI PUBLIC nDmaIob nDmaIob DW %nDmaIob ; End of system configuration block %IF (NOT %fSrp) THEN ( ; Compatibility with Srp (vars don't get set, just for linking.) Public pStat, pDiskStat, pCdt PUBLIC nMinX, nMinSmallX, nAvailX, nAvailSmallX ;DHG PUBLIC nInitX, nInitSmallX, nWaitX, nWaitSmallX ;DHG Public pProcStat, pExchStat Public sStat, sDiskStat,sProcStat,sExchStat,sDiskStat cdt DB ? pStat DD Stat1 Stat1 DB 34 Dup (0) ; dummy area nInitX DW 0 nMinX DW 0 nAvailX DW 0 nInitSmallX DW 0 nMinSmallX  DW 0 nAvailSmallX DW 0 nWaitSmallX DD 0 nWaitX DD 0 DB 17 Dup (0) sStat DW $-Stat1 pDiskStat DD Stat2 Stat2 DB 44 Dup (0) ; dummy area sDiskStat DW $-Stat2 pProcStat DD Stat3 Stat3 Label Word sProcStat DW $-Stat3 pExchStat DD Stat4 Stat4 Label Word sExchStat DW $-Stat4 pCdt DD cdt PUBLIC nWblk, sWblk, nYblk, sYblk, nZblk, sZblk PUBLIC nWblkLocal, sWblkLocal, nYblkLocal, sYblkLocal, nZblkLocal, sZblkLocal nWblk DW 0 sWblk DW 0 nYblk DW 0 sYblk DW 0 nZblk DW 0 sZblk DW 0 nWblkLocal DW 0 sWblkLocal DW 0 nYblkLocal DW 0 sYblkLocal DW 0 nZblkLocal DW 0 sZblkLocal DW 0 )FI%' NOT SRP PUBLIC nParDesc, nParDescMax nParDesc DW %nPartitions nParDescMax DW %nPartitionsMax PUBLIC fProtected fProtected DB %IF(%CTOSp) THEN (0FFh) ELSE (0)FI %if (%ctosp) then( public nGDTSlots nGdtSlots dw %nGdtSlots public nIOPermissionBits nIOPermissionBits dw %nIOPermissionBits public sgTssIntLast sgTssIntLast dw 0 public sgFreeHead sgFreeHead dw 0 public sgFreeTail sgFreeTail dw 0 public isgGdtCallGateFirst isgGdtCallGateFirst dw 0 public nGdtCallGates nGdtCallGates dw 0 public pRgoGdtLink pRgoGdtLink dd 0 PUBLIC plaEndMemory plaEndMemory DD 0 public pRgSgLdt pRgSgLdt dd 0 public pRgSwapMode pRgSwapMode dd 0 )else( public pRgoGdtLink pRgoGdtLink dd 0 )fi public sSCHeap sSCHeap dw %cParSCHeap*16 %IF (%ctosp) THEN( PUBLIC sEnvironment sEnvironment DW %sEnvironment )FI PUBLIC GraphicsInfo PUBLIC saGraphicsBoard, fGraphicsBoard, mbIOPort, bGraphicsPort GraphicsInfo label word ;Next 7 fields are a structure, lGetpGraphicsInfo. saGraphicsBoard DW 0 fGraphicsBoard DW 0 mbIOPort DW 8030h bGraphicsPort DW 0 ; debugger needs to know current vid hdwr parameters, cache them here PUBLIC iLineCurrent,iColCurrent,sMapCurrent,sarCurrent,userNumVdm iLineCurrent DB 0FFh iColCurrent DB 0FFh sMapCurrent DW 0 sarCurrent DW 0 userNumVdm DW 0 EVEN PUBLIC wOSVersion wOSVersion DW %OSVersion ; Allocated user number block definitions PUBLIC nUNMax, sUNBlocks, bUNBlkSHR, nUNBlocks, ExUcbLast ExUCBLast LABEL WORD DW %EVAL(%nUcb)-1 ; This is the last usable ExUcb as clstr and netusers ; do not need an ExUCB. nUnMax LABEL WORD DW 3FFh ;max. no of users on a w/s is set to 3FFh. sUNBlocks LABEL WORD DW 8 ;8 user numbers per block bUNBlkSHR LABEL BYTE DW 3 ;SHR 3 = 8 user numbers per block nUNBlocks LABEL WORD DW 128 ;Max. no of blocks: nUnMax/sUNBlocks EVEN ; structure of pointers for access to above locations allocUserNumb LABEL BYTE DB 24 DUP (0) org OFFSET allocUserNumb pbUNBlkSHR dd bUNBlkSHR prgbUNCount dd ? ;Set by InitAllocUsers pExUcbLast dd ExUCBLast pnUNBlocks dd nUNBlocks pwLocalUser dd ? ;Set by InitAllocUsers prgwUNOwner dd ? ;Set by InitAllocUsers org OFFSET allocUserNumb+24 ; End of allocated user number structures PUBLIC pAllocUserStruct pAllocUserStruct LABEL WORD DD allocUserNumb EVEN PUBLIC nUserNum, nWsUsers nUserNum DW %nUserNum ;Can be changed by InitAllocUsers nWsUsers DW %nUserNum - %nUcb ;Can be set by :nWsUsers: in config.sys PUBLIC fRebootClstr fRebootClstr DB 0 ; The bytes defined below are only used on CIP machines. ; ; hwIdCMOSAddr contains the CMOS address where the hardware id is ; stored. ; ; hwIdCMOSChecksumAddr contains the CMOS address where the complement of the ; hardware id can be stored. This checksum byte ensures ; that the CMOS checksum will remain valid.. ; ; fChecksumCMOSHwId is a flag that when set true causes the complement of ; the hardware id byte to be written to the CMOS address ; specified in hwIdCMOSChecksumAddr. PUBLIC hwIdCMOSAddr PUBLIC hwIdCMOSChecksumAddr PUBLIC fChecksumCMOSHwID hwIdCMOSAddr DB %hwIdCMOSAddr hwIdCMOSChecksumAddr DB %hwIdCMOSChecksumAddr fChecksumCMOSHwID DB %fChecksumCMOSHwID EVEN nOsProcDesc DW 0 ; for stack check code ; NetServerData: These variables are in a structure known by the CtNetServer. ; The NetServer calls InitNetServer (an OS common subroutine) to get a pointer ; to this structure ; ****NOTE **** This structure is known to CtNet and the Mouse and possible ; other system services. Don't insert data in the middle!!! PUBLIC userNumLast, userNumClstrLast, nNetUsers, NetServerData PUBLIC ExchNetServer PUBLIC pRgOUcb, pRgOExUcb PUBLIC cbNodeName,NodeName PUBLIC pRgWsAbortRq, pRgChgUserNumRq, pRgTerminationRq, pRgSwappingRq PUBLIC nWsAbortRq, nChgUserNumRq, nTerminationRq, nSwappingRq NetServerData LABEL WORD pRgWsAbortRq DD 0 nWsAbortRq DW 0 pRgChgUserNumRq DD 0 nChgUserNumRq DW 0 pRgTerminationRq DD 0 nTerminationRq DW 0 userNumLast DW %nUserNum+%nNetUsers-1 userNumClstrLast DW %nUserNum-1 nNetUsers DW %nNetUsers ;Can be specified in config.sys pRgSwappingRq DD 0 nSwappingRq DW 0 exchNetServer DW 0 cbNodeName DB 0 nodeName DB 12 DUP(0) EXTRN rgRcMax: FAR pRgPrgNetRouting DD ? ; This table no longer exists. pRgRcMax DD DGroup:rgRcMax obsoleteUnused DD ? ; was bitMapExchsSave PUBLIC userExchFirst userExchFirst DW ? EXTRN SysTime:WORD pSysTime DD DGroup:sysTime EXTRN BootBlock:WORD pBootBlock DD DGroup:BootBlock pRgOUcb DD rgOUcb pRgOExUcb DD rgOExUcb ;EXTRN rgCommRawVector: WORD ; was: pRgCommRawVector DD DGroup:rgCommRawVector PUBLIC userNumNetMin,userNumNetMax %IF(%fSrp) THEN ( userNumNetMin DW 9400h ; Set by board where Net installed. userNumNetMax DW 9400h ; Slot 37 assigned to net users. ) ELSE ( %if(%ctosv)then( userNumNetMin DW %nUserNum ; predefining netusers userNumNetMax DW %nUserNum+%nNetUsers-1 )else( userNumNetMin DW 0 ; Set by board where Net installed. userNumNetMax DW 0 )fi )FI PUBLIC pAckInBuf, pAckOutBuf obsoleteUnused2 DD 0 pAckOutBuf DD 0 pAckInBuf DD 0 EXTRN mouseData: WORD PUBLIC pMouseData pMouseData DD DGroup:mouseData EXTRN rgPrgLocalServiceCode: WORD prgPrgLocalServiceCode DD DGroup:rgPrgLocalServiceCode PUBLIC ExchNet exchNet DW 0 ; End of NetServerData ; ; The following are configuration variables set from the configuration file. ; Even though they are not used by all OS configurations, they must be ; present so that InitConfig will work. PUBLIC xBusWindowSize xBusWindowSize DW 0 ; = 0, 96H, 224H, or 480H ; This structure is agentParamsType in CTOSTypes. Change both places. PUBLIC agentParams PUBLIC paAgentStealSLForOs, nTryNewMaster, rgfSrpClock, fHighSpeed, rgNoWsLine PUBLIC nXBlk, sXBlk, nXBlkSmall, sXBlkSmall, nOutstandingMax, nDct PUBLIC cRcbMax, clusterTimeout, daiLocal, wsUserNumLast, nRepollActive PUBLIC agentPriority, exchAgent, exchMstrAgentReceiver PUBLIC fEnableCluster, pfRebootClstr PUBLIC wPitTicksPollIntervalMax, fAgentCache, fAgentCacheDefaultEnable agentParams LABEL BYTE paAgentStealSLForOs DD ? ;0 nTryNewMaster DW 16 ;4 rgfSrpClock LABEL BYTE fHighSpeed DB 0 ;6 DB 0 ;7 rgNoWsLine LABEL WORD nDct DW %nWsLine1 ;8 DW %nWsLine2 ;10 nXBlk DW %nXBlk ;12 sXBlk DW %sXBlk ;14 nXBlkSmall DW %nXBlkSmall ;16 sXBlkSmall DW %sXBlkSmall ;18 nOutstandingMax DW 5 ;20 cRcbMax DW %nRcb ;22 clusterTimeout DW %clusterTimeout ;24 daiLocal DW ? ;26 wsUserNumLast DW %nWsUserNum-1 ;28 nRepollActive DB %nRepollActive ;30 agentPriority DB 1 ;31 exchAgent DW 12 ;32 exchMstrAgentReceiver DW 17 ;34 fEnableCluster DB TRUE ; temporary until BOS is merged pfRebootClstr DD fRebootClstr ;37 DW ? ; exchquiet space (defined elsewhere) pallocUserNumb DD allocUserNumb ;43 wPitTicksPollIntervalMax DW 4000 ;47 exchFilterProcess DW 17 ;49 fAgentCache DB 0 ;51 fAgentCacheDefaultEnable DB 0 ;52 pfEnableCluster DD fEnableCluster ;53 DD rgRqNoRemoteTermination ;57 DD nRqNoRemoteTermination ;61 ; End of Configuration variables PUBLIC nRkvsUsers nRkvsUsers DW %nRkvsUsers PUBLIC FilterProcessExch FilterProcessExch DW 4 %IF (%fSrp) THEN ( Even Public wMasterFPCdtBase, pMasterFPCdt wMasterFPCdtBase DW ? pMasterFPCdt DD ? ) FI %IF (%fGP) THEN (%' 1 page maps 4 megabytes. PUBLIC cPagesMBusWindow PUBLIC dMemBankMap cPagesMBusWindow DW (%cMegabytesOtherBoardMax+3)/4 dMemBankMap DD 0 )FI %SET(nCommline, 0) %SET(nDmaAddr, 0) %IF (%fTP) THEN (%SET(nCommline, 4))FI %IF (%fCP) THEN (%SET(nCommline, 2))FI %IF (%fGP) THEN (%SET(nCommline, 8) %SET(nDmaAddr, 8))FI %IF (%fNGenHardware AND %ctosp) THEN (%SET(nCommline, 4) %SET(nDmaAddr, 8))FI %IF (%fNGenHardware AND NOT %ctosp) THEN (%SET(nCommline, 2))FI %IF (%nCommline GT 0) THEN ( ;Set during init time for the size of rgCommLine PUBLIC nrgCommLine nrgCommLine DW 0 PUBLIC rgCommLine rgCommLine LABEL DWORD %SET(irgCommLine, 0) %WHILE(%irgCommLine LT %nCommline) ( DD 9 DUP(0) ;4 raw procs + 4 procs + pDsBx DW 4 DUP(0) ;4 IO addr DW 0FFFFh ;Unused user-number DW %irgCommLine ;commlinehandle DW 0 ;ldtr DB 0 ;fDma DB 0 ;fDma Availible DB 0 ;NRZI type DB 0 ;ChipType DW 0 ;BaudrateIO reg DW 0 ;BRGModeReg for 8253 type clocking DB 0 ;Baud rate type for handling HW specific initalization DB 0 ;ExtCtlRegImage DD 0 ;pExtCntRegImg so that channels A&B can share an image DW 0 ;ExtCtlReg DW 0 ;ExtStatReg  DW 0 ;ExtClkCntReg DB 0 ;TRxDirMask DB 0 ;DTRSourceMask DW 0 ;ioExtra1 for 2681 DW 0 ;ioExtra1 for 2681 DW 0 ;ioExtra1 for 2681 DW 0 ;IntOpMask for interrupt controler (en)(dis)able DB 0 ;ExtStatRegType DB 0 ;ExtCntRegType DB 0 ;fPCAT *AA* DB 0 ;RTxDirMask DW 0 ; . %SET(irgCommLine, %irgCommLine + 1) ) )FI%' nCommLine ; one DmaAddr structure is needed for each communications port that supports ; comm dma. For each pair of channels, one CommDmaEnable word is required. ; PUBLIC rgDmaAddr rgDmaAddr LABEL WORD %SET(irgDMAAddr, 0) %WHILE(%irgDMAAddr LT %nDmaAddr) ( %'DW 13 DUP(0) dw 2 dup(0) ;dma AddrReg (Rx/Tx) dw 2 dup(0) ;dma CountReg (Rx/Tx) dw 2 dup(0) ;ear (16-23 address) (Rx/Tx) dw 2 dup(0) ;ear (23-32 address) (Rx/Tx) dw 2 dup(0) ;dma MaskReg (Rx/Tx) dw 2 dup(0) ;dma ModeReg (Rx/Tx) dw 2 dup(0) ;dma BytePtrClr (Rx/Tx) dw 1 dup(0) ;ear EnableReg dw 2 dup(0) ;dma CmdReg (Rx/Tx) DB 6 DUP(0) DW 2 DUP(0) DD 2 DUP(0) ;DMA mapper for XE DW 2 DUP(0) ;ModeReg2, CmdReg2 *AA* DW 2 DUP(0) ;ReqAddrRegLow *AA* DW 2 DUP(0) ;ReqAddrRegHigh *AA* %SET(irgDMAAddr, %irgDMAAddr + 1) ) PUBLIC rgCommDmaEnable rgCommDmaEnable DB (0) ; The EventControlBlock is a structure that is used mostly for mail. A ; pointer is returned by GetPStructure. PUBLIC EventControlBlock eventControlBlock DW 32 ; The first word contains the length in bytes. DB 32 DUP(0) PUBLIC nTicks nTicks DB 4 PUBLIC cFramesMax cFramesMax DB %nFrames PUBLIC extCntlRegAws extCntlRegAws DB 0 %IF ((%sKbdBuffer LT 16) OR (%sKbdBuffer GT 1024)) THEN(%Error(sKbdBuffer out of range) %SET(sKbdBuffer,128))FI %IF (((%sKbdBuffer-1) AND %sKbdBuffer) NE 0) THEN(%Error(sKbdBuffer not a power of 2) %SET(sKbdBuffer,128))FI EVEN PUBLIC contingencyLog contingencyLog DW %sContingencyLog DUP (0) PUBLIC sBufOut, mBufOut mBufOut DW %sKbdBuffer-1 sBufOut DW %sKbdBuffer %IF (not(%*Isdef(%sIBusBuffer))) THEN (%Define(sIBusBuffer)(64))FI %IF (((%sIBusBuffer-1) AND %sIBusBuffer) NE 0) THEN(%Error(sIBusBuffer not a power of 2) %SET(sIBusBuffer,128))FI rgbBufLEDs DB %sIBusBuffer DUP(0) rgbBufIOaddr DB %sIBusBuffer DUP(0) ibBufLEDsPut DW 0 ibBufLEDsTake DW 0 maskiBufLED DW %sIBusBuffer-1 PUBLIC rgbBufLEDs, ibBufLEDsPut, ibBufLEDsTake, maskiBufLED, rgbBufIOaddr %if(%ctosp)then( PUBLIC nSoftwareInt nSoftwareInt DW 0 PUBLIC nHardwareInt nHardwareInt DW 0 )else( PUBLIC nRawInt, nMediatedInt nRawInt DW 0 nMediatedInt DW 0 )fi PUBLIC sExec sExec DW %sParExitRunFile PUBLIC pXlatTable, wXlatTableChksum, pUserXlatTable pXlatTable DD 0 wXlatTableChksum DW 0 pUserXlatTable DD 0 PUBLIC nSwapFabs nSwapFabs DW %nSwapFabs %IF (%ctosp) THEN ( PUBLIC nKbdTimers, rgiKbdTimer nKbdTimers DW %nKbdTimers rgiKbdTimer DW %nKbdTimers DUP (0) )FI %IF(%fVarPar)THEN( PUBLIC exchSched,exchSchedPocket, exchQuiet exchSched DW 6 exchSchedPocket DW ? ;leave space for AllocSysExch to fill exchQuiet DW ? )ELSE(%IF(%fMulPar)THEN( PUBLIC exchQuiet exchQuiet DW 5 ;exchTermination )FI)FI PUBLIC exchRqTracker, exchSpecHeap, exchOSNamePlace, exchPit exchRqTracker DW ? ;AllocSysExch initializes exchSpecHeap DW ? exchOSNamePlace DW ? exchPit DW ? PUBLIC fWrappedDebugger fWrappedDebugger DB %fWrappedDebugger PUBLIC tyDevMax, mptyDevMask, sgRgHwIntDescInit, sgRgHardwareIntDesc tyDevMax DW tyDevLast+1 mptyDevMask DW tyDevLast+1 DUP(0,0,0,0,0,0) ; Filled out in InitIoAddr.plm. sgRgHwIntDescInit DW HwIntDescInitSeg sgRgHardwareIntDesc DW 0 EVEN ; irgoExchReal identifies the virtual exchange table used to map exchanges PUBLIC irgoExchReal irgoExchReal LABEL BYTE %IF(%fSrp)THEN( %IF((%fFP)OR(%fDP))THEN(DB 4)FI %IF(%fTP)THEN(DB 5)FI %IF(%fCP)THEN(DB 6)FI %IF(%fSP)THEN(DB 7)FI %IF(%fGP)THEN(DB 8)FI %IF(%fNGenHardware)THEN(DB 11)FI )ELSE( %IF(%clusterConfig EQ 0)THEN(DB 2)FI %'standalone %IF(%clusterConfig EQ 1)THEN(%'cluster %IF(%localFS EQ 0)THEN(DB 0)ELSE(DB 1)FI )FI %IF(%clusterConfig EQ 2)THEN(DB 3)FI %'master )FI %IF(%Statistics) THEN ( TaskSwitch DD 0 IntTaskSwitch DD 0 IdleProcessCycles DD 0 )FI ;**************************************************************************** ; Bsac extensions ;**************************************************************************** %if (%bsac) then ( PUBLIC fBsacResident, fAcsResident, UserNumAcs, RgTrustLevel fBsacResident DB 0 fAcsResident DB 0 UsernumAcs DB 0 RgTrustLevel DW %nPartitions DUP (0) )fi ;**************************************************************************** ; Parameters for the multi-partition OS ;**************************************************************************** ; %IF (%fMulPar) THEN ( PUBLIC oExUcb PUBLIC saMaxPartition PUBLIC cbExtDumpMsg, rgbExtDumpMsg %IF (%fVarPar) THEN ( PUBLIC rgsgAsib PUBLIC nAsib, nArib PUBLIC sbSwapFileTryFirst PUBLIC sbSwapFileTryFirstPswd PUBLIC sbSwapFileTryEach PUBLIC sbSwapFileTryEachPswd PUBLIC ibSwapFileNumber PUBLIC swapFileSize PUBLIC pMemMap PUBLIC cMemMapSlots )FI EVEN oExUcb DW 0 saMaxPartition DW 0 PUBLIC timeSliceLb, timeSliceHb, fTimeSlice timeSliceLb DB %lbTimeSlicePriority timeSliceHb DB %hbTimeSlicePriority fTimeSlice DB %fTimeSliceEnable %IF (%fVarPar) THEN ( AsibOs SEGMENT PUBLIC 'OEMSeg' DB 256 DUP(0) AsibOs ENDS ; This array is not based, and its size won't change. ; We always leave enough room for the max size. rgsgAsib LABEL WORD DW AsibOs DW %nPartitionsMax-1 DUP(0) nAsib DW %nAsib nArib DW %nArib pMemMap DD 0 cMemMapSlots DW %cMemMapSlots )FI %IF (not(%*Isdef(%nUSeg))) THEN (%Define(nUSeg)(32))FI PUBLIC rgUSegCb, rgUSegfLL, cUSeg, cUSegMax cUSegMax DW %nUSeg cUSeg DW 0 rgUSegCb DW %nUSeg DUP(0) rgUSegfLL DB %nUSeg DUP(0) ) FI%' Mulpar ;**************************************************************** ; If the CTOS becomes too big to load the font, one can ; reserve 8704 bytes at low memory which will be used by ; LoadFontRam operations. To reserve this font buffer, one ; should set FontRamBuf to 0FFh before Init Macro in Sysgen.asm ;**************************************************************** %IF (%FontRamBuf NE 0) THEN ( EVEN Sysgen_LowMem SEGMENT PUBLIC 'LowMem' fontRamBuf DB 8704 DUP (0) Sysgen_LowMem ENDS ) FI ;**************************************************************** ; The following are the text portions of the messages put out ; by the CTOS Operating System ;**************************************************************** ; The following is the header of the crash message put out by the OS. ; The entire message looks like : ; CRASH STATUS (ERC 22.) 16H 5H 0H 0H 0H 0H 31C0H 22H PUBLIC rgCrashMsg, cbRgCrashMsg cbRgCrashMsg DB 17 ; The size of the message string rgCrashMsg DB 'CRASH STATUS ',28h,'ERC' ; The following is the previous crash message put out by the OS when it is ; rebooted. The entire message looks like : ; LAST CRASH STATUS (ERC 22.) 16H 5H 0H 0H 0H 0H 31C0H 22H PUBLIC rgLastCrashMsg, cbRgLastCrashMsg cbRgLastCrashMsg DB 22 ; length of the text string rgLastCrashMsg DB 'LAST CRASH STATUS ',28h,'ERC' ; The following is the message put out by the cluster workstation OS when it ; detects that the master workstation is down. The entire message looks like: ; CLUSTER NOT RUNNING, ERC = 6 PUBLIC rgClusterMsg, cbRgClusterMsg cbRgClusterMsg DB 26 ; length of the text string rgClusterMsg DB 'CLUSTER NOT RUNNING, ERC =' ; The following is the message put out by the OS when the exit run file cannot ; be loaded. The entire message looks like: ; CANNOT LOAD EXIT RUN FILE, ERC = 203 PUBLIC rgExitFileError, cbRgExitFileError cbRgExitFileError DB 32 ; length of the text string rgExitFileError DB 'CANNOT LOAD EXIT RUN FILE, ERC =' ; The following is the message put out by the OS when some hardware error is ; detected during its initialization. The entire message looks like: ; INITIALIZATION ERROR STATUS 8000H PUBLIC rgInitError, cbRgInitError cbRgInitError DB 27 ; length of the text string rgInitError DB 'INITIALIZATION ERROR STATUS' ; The following is the name given to the primary partition. PUBLIC cbPriParName, rgPriParName cbPriParName DB 7 ; length of the text string rgPriParName DB 'Primary' ; The following is the default name given to a partition in which a system ; service resides. PUBLIC cbSysSvcParName, rgSysSvcParname cbSysSvcParName DB 12 ; length of the text string rgSysSvcParName DB 'SysService00' ; The following is printed when the user needs to run Extended Crash Dump and ; then reboot, in order to regain memory above 1 or 4 Mb. cbExtDumpMsg DB 58 ; length of the text string rgbExtDumpMsg DB 'Run Extended Crash Dump and reboot to regain high memory.',10 ; The following is printed when a ClientCard cannot be found by a cluster CTOS ; running on a CIP/CPE machine. PUBLIC cbNoClientCard, rgbNoClientCard cbNoClientCard DB 52 ; length of the text string rgbNoClientCard DB 'A Unisys CTOS ClientCard is required, but not found.',10 ; The following is printed when a old revision ClusterCard is found by CTOS ; running on a CIP/CPE machine. PUBLIC cbWrongClientCard, rgbWrongClientCard cbWrongClientCard DB 55 ; length of the text string rgbWrongClientCard DB 'Unisys  ClientCard required, ClusterCard is not usable.',10 ; The following is printed when the ClientCard switches are set wrong when ; running on a CIP/CPE machine. PUBLIC cbWrongClientCardSW, rgbWrongClientCardSW cbWrongClientCardSW DB 53 ; length of the text string rgbWrongClientCardSW DB 'Incorrect switch settings on Unisys CTOS ClientCard.',10 ; The following is printed when attempting to boot CTOS on a 286 or lower ; running on a CIP/CPE machine. PUBLIC cbNeed386, rgbNeed386 cbNeed386 DB 52 ; length of the text string rgbNeed386 DB 'This CTOS operates only with 80386 and higher CPUs.',10 ; The following are sent to WriteLine in Init_P.asm and Fault_P.plm PUBLIC rgbGpFault, rgbDoubleFault, rgbDivideFault, rgbOverflowFault PUBLIC rgbRangeFault, rgbBogusOpFault, rgbBogusTssFault, rgbNotPresentFault PUBLIC rgbStackFault, rgbXBusTimeout, rgbDefaultInt PUBLIC rgbNmiFault, rgbPageFault, cbNmiAddr, rgbNmiAddr, cbBusTimeout PUBLIC rgbBusTimeout, cbMemParity, rgbMemParity, cbDuringDMA, rgbDuringDMA PUBLIC cbUtilReg, rgbUtilReg rgbGpFault db 'GP fault',0 rgbDoubleFault db 'Double fault',0 rgbDivideFault db 'Divide fault',0 rgbOverflowFault db 'INTO',0 rgbRangeFault db 'Range fault',0 rgbBogusOpFault db 'Bogus op',0 rgbBogusTssFault db 'Invalid TSS',0 rgbNotPresentFault db 'Not present fault',0 rgbStackFault db 'Stack fault',0 rgbDefaultInt db 'Default int vector',0 rgbXBusTimeout db 'XBus timeout',0 rgbNmiFault db 'Non Maskable Interrupt',0 rgbPageFault db 'Page fault',0 cbNmiAddr dw 13 rgbNmiAddr db 'nmi address: ' cbBusTimeout dw 13 rgbBusTimeout db 'Bus timeout: ' cbMemParity dw 15 rgbMemParity db 'Memory parity: ' cbDuringDMA dw 12 rgbDuringDMA db '(during dma)' cbUtilReg dw 18 rgbUtilReg db 'Utility register: ' EVEN ;**************************************************************************** ; Variables common to all ctosv ;**************************************************************************** %IF ((%ctosp) AND (NOT(%ctosv))) THEN ( ; UBuf used by termination - must be paragraph aligned ; segment is classed with const so its not coeded PUBLIC uBuf uBufSeg SEGMENT PARA PUBLIC 'Const' UBuf DW 256 DUP(?) uBufSeg ENDS DGroup GROUP uBufSeg )FI ;**************************************************************************** ; Variables common to all CTOS ;**************************************************************************** ; The following is the name of the run file which is chained to by all NGen OSs ; before SysInit in order to check the XBus configuration PUBLIC rgCheckConfig, cbRgCheckConfig cbRgCheckConfig DB 27 ; The size of the message string rgCheckConfig DB '[Sys]DisplayConfig.run' PUBLIC rgCheckConfigPswd, cbRgCheckConfigPswd cbRgCheckConfigPswd DB 0 ; The size of the message string rgCheckConfigPswd DB 0 PUBLIC cbCrashDumpPath, rgbCrashDumpPath, cbCrashDumpPassword, rgbCrashDumpPassword %IF(%fSrp) THEN ( cbCrashDumpPath DW 10 rgbCrashDumpPath DB '[sys]', 18 DUP(0) cbCrashDumpPassword DW 0 rgbCrashDumpPassword DB 12 DUP(0) ) ELSE (%' WS rgbCrashDumpPath DB '[sys]' cbCrashDumpPath DW 10 rgbCrashDumpPassword LABEL BYTE ;password not allowed cbCrashDumpPassword DW 0 )FI EVEN ;**************************************************************************** ; Variables for Ngen Master - vMstr ;**************************************************************************** %IF ((%wsType EQ ngenMaster) AND NOT %fSrp) THEN ( PUBLIC fGraphicsBoard ) FI%' wsType = ngenMaster EVEN ;**************************************************************************** ; Variables for all SRP ;**************************************************************************** %IF (%fSrp) THEN ( PUBLIC fForceSlotBits fForceSlotBits DB %fForceSlotBits %If (%fGP) Then ( Public fGpBootTapeSysgen fGpBootTapeSysgen DB %fGpBootTapeLoader ) Fi pCdt DD Cdt const segment word public 'CONST' PUBLIC rgbTypeTable, rgbXpChar, srgbTypeTable %IF(%fNGenHardware) THEN ( rgbTypeTable DB 0,4,32,33,34,35,63 rgbXpChar DB '?EEEEEE' srgbTypeTable DW 7 ) ELSE ( rgbTypeTable DB 0,10,11,12,13,14,15,16,20,21,22,64,65,0FFh rgbXpChar DB '?FTCSDRNGGGAAB' srgbTypeTable DW 14 )FI%' const ENDS oRgClusterTerm DW 0 fSrpUp DB 0 PUBLIC exchFilterPocket exchFilterPocket DW ? Public Mask186 %If (%fFP) Then ( Mask186 DW 0FFh-21h ) Else ( %If (%fTP) Then ( Mask186 DW 0FFh-20h ) Else ( %If (%fCP) Then ( Mask186 DW 0FFh-30h ) Else ( %If (%fDP) Then ( Mask186 DW 0FFh-21h ) Else ( Mask186 DW 0FFh-21h ) Fi) Fi) Fi) Fi Even %If (%fCP OR %fGP) Then ( EVEN ; PTs are no longer supported (CTOS/SRP 3.0) ; ; TP polling is supported on CP. Public nsTpInBuf, nsTpOutBuf nsTpInBuf dw %sTpInBuf nsTpOutBuf dw %sTpOutBuf TpInHdrs equ 12 TpOutHdrs equ 30 Public sTpInHdr, sTpOutHdr sTpInHdr dw TpInHdrs sTpOutHdr dw TpOutHdrs PUBLIC fClPoll,ClPollTimer fClPoll DB 0FFh ClPollTimer DB 0FFh Public rgTpInBuffers, rgTpOutBuffers rgTpInBuffers db 3*%sTpInBuf + 3*TpInHdrs dup(0) rgTpOutBuffers db 3*%sTpOutBuf + 3*TpOutHdrs + 3 dup(0) alignment Dw 6 Dup (0) overwritten Db 'CTOS' ) Else (%' Not CP or GP %If (%fTP) Then ( EVEN Public nsTpInBuf, nsTpOutBuf nsTpInBuf dw %sTpInBuf nsTpOutBuf dw %sTpOutBuf Public sTpInHdr, sTpOutHdr TpInHdrs equ 12 TpOutHdrs equ 30 sTpInHdr dw TpInHdrs sTpOutHdr dw TpOutHdrs Public rgTpInBuffers, rgTpOutBuffers rgTpInBuffers db 10*%sTpInBuf + 10*TpInHdrs dup(0) rgTpOutBuffers db 10*%sTpOutBuf + 10*TpOutHdrs + 10 dup(0) alignment dw 20 dup (0) ; since qual alignment now overwritten db 'CTOS' ) Fi ) FI EVEN PUBLIC nRcb, nWblk, sWblk, nYblk, sYblk, nZblk, sZblk PUBLIC nWblkLocal, sWblkLocal, nYblkLocal, sYblkLocal, nZblkLocal, sZblkLocal nRcb DW %nRcb nWblk DW %nWblk sWblk DW %sWblk nYblk DW %nYBlk sYblk DW %sYblk nZblk DW %nZblk sZblk DW %sZblk nWblkLocal DW %nWblk sWblkLocal DW %sWblk nYblkLocal DW %nYblk sYblkLocal DW %sYblk nZblkLocal DW %nZblk sZblkLocal DW %sZblk PUBLIC sBroadcastHeap sBroadcastHeap DW %sBroadcastHeap EVEN %SET(iFixUp, 0) %WHILE(%iFixUp LT %nFixUp) ( Lab%iFixup LABEL BYTE %IF (%iFixUp EQ 0) THEN ( DW 0 )ELSE( %SET(iLabel,%iFixup-1) DW OFFSET DGroup:Lab%iLabel )FI DW 0,0,0 %SET(iFixup, %iFixUp+1) ) %SET(iLabel,%nFixup-1) Public oFixupFree, oFixupHead oFixupFree DW OFFSET DGroup:Lab%iLabel oFixupHead DW 0 %if (NOT %fNoFileSystem) Then ( %IF (NOT(%*ISDEF(%nSequentialDevicesMax))) THEN ( %DEFINE(nSequentialDevicesMax)(8) )FI PUBLIC nSequentialDevicesMax, sgSequentialDcbSeg nSequentialDevicesMax DW %nSequentialDevicesMax sgSequentialDcbSeg DW 0 sMountTabEntry Equ 1+13+13 ; Allocate a mount table entry for each possible ; MassStorage device SysGen parameter. ; SequentialStorage device SysGen parameter. ; Booted board (36) 6 cabinets, 6 processors each. ; ScsiManagerName (8) Maximum number of FileSystems. ; RemoteCacheName (12) A reasonable limit for a normal system. ; "MasterFP", etc. (4) Any odds and ends. Public maxDevMounted, nDevMounted maxDevMounted Dw %nMountedDisks+%nSequentialDevicesMax+60 nDevMounted Dw 0 ) ELSE (%' Non-FileSystem board dummy PUBLIC nSequentialDevicesMax, sgSequentialDcbSeg nSequentialDevicesMax LABEL WORD sgSequentialDcbSeg LABEL WORD ) Fi nDummy Equ 5 ; padding of each area Even Public pStat, pDiskStat, pCdt Public pProcStat, pExchStat Public sStat, sDiskStat, sProcStat, sExchStat PUBLIC nMinX, nMinSmallX, nAvailX, nAvailSmallX ;DHG PUBLIC nInitX, nInitSmallX, nWaitX, nWaitSmallX ;DHG PUBLIC nMinW, nMinY, nMinZ, nAvailW, nAvailY, nAvailZ ;DHG... PUBLIC nWaitY, nWaitZ, nWaitW ;...DHG ;JA... PUBLIC nWaitWLocal, nWaitYLocal, nWaitZLocal PUBLIC nMinWLocal, nInitWLocal, nAvailWLocal PUBLIC nMinYLocal, nInitYLocal, nAvailYLocal PUBLIC nMinZLocal, nInitZLocal, nAvailZLocal ;...JA PUBLIC nLocRead, nLocWrite, nLocSeeks Public nRemRead, nRemWrite, nRemSeeks, nExchIn Public nInitW, nInitY, nInitZ Public nIobUsed PUBLIC nMinFAB, cFreeFab pStat DD Stat1 Stat1 Label Word DW 6 Stat1nPcb LABEL WORD DW %nPcb Stat1nUsrExchangeplus30 LABEL WORD DW %nUsrExchange+30 ; 30 is guess at upper limit m_nSysExch. nInitY DW %nYblk nMinY DW %nYblk nAvailY DW %nYblk nInitZ DW %nZblk nMinZ DW %nZblk nAvailZ DW %nZblk revision DW 1 reserved DW 0 reserved2 DW 0 nMinFAB DW 0 cFreeFab DW 0 ;incremented to nFab by InitFile. nInitW DW %nWblk nMinW DW %nWblk nAvailW DW %nWblk ;DHG... nInitX DW %nXblk nMinX DW %nXblk nAvailX DW %nXblk nInitSmallX DW %nXBlkSmall nMinSmallX DW %nXBlkSmall nAvailSmallX DW %nXBlkSmall nWaitSmallX DD 0 nWaitX DD 0 nWaitW DD 0 nWaitY DD 0 nWaitZ DD 0 ;...DHG ; JA... nWaitWLocal DD 0 nWaitYLocal DD 0 nWaitZLocal DD 0 nInitYLocal DW %nYblk nMinYLocal DW %nYblk nAvailYLocal DW %nYblk nInitZLocal DW %nZblk nMinZLocal DW %nZblk nAvailZLocal DW %nZblk nInitWLocal DW %nWblk nMinWLocal DW %nWblk nAvailWLocal DW %nWblk ;...JA DW nDummy Dup (0) sStat DW $-Stat1 pDiskStat DD Stat2 StatsSeg SEGMENT WORD PUBLIC 'OemSeg' Stat2 Label Word nLocRead DW 6 Dup (0) ; 6 is max possible # di sks/processor nLocWrite DW 6 Dup (0) nLocSeeks DW 6 Dup (0) nRemRead DW 6 Dup (0) ; 6 is max possible # disks/processor nRemWrite DW 6 Dup (0) nRemSeeks DW 6 Dup (0) nIobUsed DW 6 Dup (0) DW nDummy Dup (0) sStatSeg EQU $-Stat2 StatsSeg ENDS sDiskStat DW sStatSeg pProcStat DD Stat3 StatsSeg SEGMENT WORD PUBLIC 'OemSeg' Stat3 Label Word DW %nPcb DUP (0) DW nDummy Dup (0) sStatSeg EQU $-Stat3 StatsSeg ENDS sProcStat DW sStatSeg pExchStat DD Stat4 StatsSeg SEGMENT WORD PUBLIC 'OemSeg' Stat4 Label Word ; 30 is guess at upper limit m_nSysExch. nExchIn DW (%nUsrExchange+30) DUP (0) DW nDummy Dup (0) sStatSeg EQU $-Stat4 StatsSeg ENDS sExchStat DW sStatSeg CdtSeg Segment Public 'Cdt' ; define a Cdt, but with the offsets, etc. in 8086 format. StatOffset Equ Offset StatArea - Offset Cdt %If (NOT %fNoFileSystem)Then ( HandleOffset Equ Offset HandleArea - Offset Cdt )Fi Cdt Label Byte %'paIccSeg' DB 4 Dup (?) %'filler$0 (4)' DB 4 Dup (?) %'bProcessorType' DB %hardwareType %'fWatchDog' DB 0 %'fWashDisable' DB 0 %'filler$1 (0Bh)' DB 11 Dup (?) %'qMemorySize' DD ? %'fLockByte' DB 0 %'bInitErrorStatus' DB 0 %'bMemorySize' DB ? %'bBootStruct$FF' DB 0FFh %'bBootStruct$0' DB 0 %'bBootStruct$A6' DB 0A6h %'bBootCommand' DB 0 %'bMasterFP' DB ? %'fOsInitialized' DB 0 %'fCdtIO' DB 0 %'oStatArea' DW StatOffset %'sStatArea' DW %sStatArea %'rgbFPXlate' DB 8 Dup (?) %'rgbBusConfigTable'DB 240 Dup (?) %'nUserNumber' DW ? %'bTTiStatus' DB ? %'bTTiData' DB ? %'bTToStatus' DB ? %'bTToData' DB ? %'wPanelStatus' DW ? %'bFrontPanel' DB ? %'fDegraded' DB ? %'bDumpCommand' DB ? %'fDisCls' DB ? %'wCpWho' DW ? %'WCpTimer' DW ? %'verifyCode' DB ? %'bBoardsNotReady' DB ? %'paConfigFile' DD ? %'cbConfigFile' DW ? %'cLocalUserNums' DW %nPartitions %'userNumMax' DW %nUserNum-1 %'filler$2 (3Ch)' DB 60 Dup (?) ; Following portion of the table is file processor specific %If (NOT %fNoFileSystem) Then ( %'oHandleTable' DW HandleOffset %'sHandleTable' DW %nDeviceHandle %'oHandleFree' DW ? %'nDevMounted' DW 0 %'paMasterMountTable' DD 0 %'rgObit(5)' DB 5 Dup (0) %'filler$3 (3)' DB 3 Dup (?) ) Fi Even StatArea DW %sStatArea Dup (?) Even %If (NOT %fNoFileSystem) Then ( HandleArea DB %nDeviceHandle*6 Dup (?) ) Fi Even CdtSeg Ends ) ELSE ( PUBLIC nSequentialDevicesMax, sgSequentialDcbSeg nSequentialDevicesMax DW 0 sgSequentialDcbSeg DW 0 )FI%' ALL SRP %IF (%clusterConfig EQ standAlone) THEN ( ; dummy labels for StandAlone PUBLIC sgMyShadow, pSgMyIcc sgMyShadow LABEL BYTE pSgMyIcc DD 0 )FI EVEN ;**************************************************************************** ; MACRO DEFINITIONS ;**************************************************************************** ; ; $EJECT ; ; macro for encryption key and buffer ; %*DEFINE (DefineEncryptionKey (wKeyValue))( ; Allocate room for sbType for GetpStructure, but set public to actual data. ; First reserve room for the cb, define the key, org back and fill in the cb. PUBLIC EncryptionKey _sbCb_ db ? EncryptionKey dw %wKeyValue EncryptionKeyEnd label byte _cbKey_ EQU OFFSET EncryptionKeyEnd - OFFSET EncryptionKey ORG OFFSET _sbCb_ DB _cbKey_ ORG OFFSET EncryptionKeyEnd ) $EJECT %IF (0) THEN (%' Obsolete real mode macros ; ; macro for defining real mode raw interrupt handler structure ; %*DEFINE (RawInterrupt (level,entry))( %IF (%m_nRawInt EQ 0) THEN ( PUBLIC rgRawIntDesc rgRawIntDesc LABEL WORD ) FI %EXTRN(%entry) DB %level DD %entry %SET(m_nRawInt, %m_nRawInt+1) ) ; ; Macro for defining real mode mediated interrupt handler structure. ; %*DEFINE (MediatedInterrupt (type,f8259,entry))( %IF (%m_nMediatedInt EQ 0) THEN ( PUBLIC rgMediatedIntDesc rgMediatedIntDesc LABEL WORD ) FI %EXTRN(%entry) DB %type,%f8259 DD %entry %SET(m_nMediatedInt, %m_nMediatedInt+1) ) )FI%' Obsolete real mode macros $EJECT ; ; macro for defining protected mode software interupt handler structure ; %*DEFINE (SoftwareInterrupt (level,entry,sStack,fMediated))( %IF (%m_nSoftwareInt EQ 0) THEN ( PUBLIC rgSoftwareIntDesc rgSoftwareIntDesc LABEL WORD ) FI %EXTRN(%entry) DB %level DD %entry DW %sStack DB %fMediated %SET(m_nSoftwareInt, %m_nSoftwareInt+1) ) $EJECT ; ; Macros for defining protected mode hardware interrupt handler structure. ; %DEFINE(m_oHwInt)(0) %DEFINE(m_cHwInt)(0FFFFh) sHwIntDescInit EQU 17 %*DEFINE(HardwareInterrupt(iInt,tyDev,chip,bit,wMem,entry,sStack,attr))( %IF (%tyDev EQ tyController) THEN ( ; Create rgHwIntTableDesc (oRgHwIntDescInit, cHwIntDescInit) in DGroup. %IF (NOT %IsDef(rgHwIntTableDesc)) THEN ( PUBLIC rgHwIntTableDesc rgHwIntTableDesc LABEL WORD ) FI %IF (NOT(%m_cHwInt EQ 0FFFFh)) THEN ( DW %m_cHwInt ) FI DW %m_oHwInt %DEFINE(m_cHwInt)(0) ) FI HwIntDescInitSeg SEGMENT WORD PUBLIC 'MEMORY' %IF (NOT %IsDef(rgHwIntDescInit)) THEN ( PUBLIC rgHwIntDescInit rgHwIntDescInit LABEL WORD ) FI %DEFINE(port)(0FFh) %IF (%EQS(%chip,186)) THEN (%DEFINE(port)(0)) FI %IF (%EQS(%chip,8259)) THEN (%DEFINE(port)(1)) FI %IF (%EQS(%chip,8259Cascade)) THEN (%DEFINE(port)(2)) FI %IF (%EQS(%chip,8259Cascade2)) THEN (%DEFINE(port)(3)) FI %IF (%EQS(%chip,DmaLPT)) THEN (%DEFINE(port)(4)) FI %IF (%EQS(%chip,Ext8259)) THEN (%DEFINE(port)(5)) FI %IF (%port EQ 0FFh) THEN (%Error(Unknown chip type '%chip')) FI ; Create rgHwIntDescInit. ; InitVector builds rgHardwareIntDesc, InitIoAddr builds mpTyDevMask. DW %tyDev DW %port DW %bit %IF (%EQS(%wMem,0)) THEN ( DW 0 ) ELSE ( %IF (NOT %*IsDef(%wMem)) THEN ( EXTRN %wMem: WORD ) FI DW OFFSET DGroup:%wMem ) FI DW %iInt %IF (%EQS(%entry,NIL)) THEN ( DD 0 ) ELSE ( %IF (NOT %*IsDef(%entry)) THEN ( HwIntDescInitSeg ENDS Data ENDS EXTRN %entry: FAR Data SEGMENT BYTE PUBLIC 'DATA' HwIntDescInitSeg SEGMENT BYTE PUBLIC 'MEMORY' ) FI DD %entry ) FI DW %sStack ; fEnable as described in SysGen.asm is really bAttributes: ; bit 1 = early EOI ; bit 0 = interrupts enabled %IF (%EQS(%attr,CLI)) THEN ( DB 0 ) ELSE ( %IF (%EQS(%attr,STI)) THEN ( DB 1 ) ELSE ( DB %attr ) FI ) FI %DEFINE(m_oHwInt)(%EVAL(%m_oHwInt+sHwIntDescInit)) %DEFINE(m_cHwInt)(%EVAL(%m_cHwInt+1)) HwIntDescInitSeg ENDS ) ; Fills in rgHwIntTableDesc(i).cHwIntDescInit for last table. %*DEFINE(EndHardwareInterruptTables)( DW %m_cHwInt ) $EJECT %*DEFINE (RequestFileName(name))() ; ; This macro sets counters for resident tables, data, and then reserves the OsTable. ; %*DEFINE(ResidentDataBoundry(size))( %if(not %ctosp)then( sMediatedIntTable EQU %maxMedInterruptType+1 PUBLIC intSwtbl, sIntSwtbl sIntSwtbl DW sMediatedIntTable IntSwTbl DW cwIntSwTblEntry*sMediatedIntTable DUP (0) )fi rgOsTable DB %size DUP(0) EVEN endOsTable DW 0 ) $EJECT ; ; Test definition of m_SysExchX (internal macro) ; %*DEFINE (TestSysExch(exch))(%TestSymbol(%Pass1%eval(%exch))) %*DEFINE (TestSymbol(Postfix))(%*Isdef(%m_SysExch%Postfix)) %*DEFINE (MakeSysExch(exch))(%' %SET(m_SysExch%Pass1%eval(%exch),%exch)%' value is not used, only isdef checks ) ; ; Assign a System Exchange ; %*DEFINE (AssignSysExch(exch,name))(%' %IF (%TestSysExch(%exch)) THEN (%Error(Duplicate Sys Exch Def-%exch)%' )ELSE(%MakeSysExch(%exch)%' m_val%name EQU %exch %NameSysExch(%exch,%name)%' %IF(%exch GT %m_SysExch)THEN(%' %SET (m_SysExch,%exch)%' )FI)FI) ; ; Alloc a System Exchange, expands as a constant ; %*DEFINE (SysExch)(%' %WHILE(%TestSysExch(%m_ExchLast))(%SET(m_ExchLast,%m_ExchLast+1))%' %MakeSysExch(%m_ExchLast)%' %IF(%m_ExchLast GT %m_SysExch)THEN(%' %SET (m_SysExch,%m_ExchLast)%' )FI%' This next line expands to the actual exchange, intended for DW arg. %m_ExchLast) ; ; Alloc a System Exchange, set word variable ; %*DEFINE (AllocSysExch(name))(%' m_val%name EQU %SysExch xxTemp%name label byte ORG OFFSET %name DW m_val%name ORG OFFSET xxTemp%name %NameSysExch(m_val%name,%name) ) ; ; Name a System Exchange ; ; 8/16/89 BF change class name from OEMSeg to MEMORY/coed ala IrfSeg ; for automatic discard after init ; oSbExchSeg SEGMENT WORD PUBLIC 'memory' PUBLIC rgOSbExch rgOSbExch LABEL WORD ;offsets to Sbs, by exch #, index 0 is limit of array oSbExchSeg ENDS sbExchSeg SEGMENT BYTE PUBLIC 'memory' rgSbExch LABEL BYTE ;compact array of Sbs sbExchSeg ENDS DbgGroup Group oSbExchSeg, sbExchSeg %*DEFINE (NameSysExch(exch,name))(%' sbExchSeg SEGMENT sbExch%eval(%exch) EQU OFFSET $ DB 0 DB '%debl(%name)' sbExchNext EQU OFFSET $ ORG sbExch%eval(%exch) DB sbExchNext-sbExch%eval(%exch)-1 ORG sbExchNext sbExchSeg ENDS oSbExchSeg SEGMENT %IF(%m_oSbExchLast LE %exch) THEN(%' oSbExchNext EQU OFFSET $ ORG OFFSET rgOSbExch DW %exch ORG oSbExchNext )FI%' %WHILE(%m_oSbExchLast LE %exch)(%' oSbExch%eval(%m_oSbExchLast) DW 0 %SET(m_oSbExchLast,%m_oSbExchLast+1)%' )%' oSbExchNext EQU OFFSET $ ORG OFFSET oSbExch%eval(%exch) DW dbgGroup:sbExch%eval(%exch) ORG oSbExchNext oSbExchSeg ENDS ) $EJECT %*DEFINE(InitRunFile("rgbRunFile", "attr")) LOCAL sbSpec ( IrfStringSeg SEGMENT BYTE PUBLIC 'MEMORY' %sbSpec DB %LEN(%rgbRunFile), '%rgbRunFile' %IF (%cIrf LT 2) THEN ( DB 92-%LEN(%rgbRunFile) DUP (0) )FI IrfStringSeg ENDS IrfSeg SEGMENT PARA PUBLIC 'MEMORY' DW InitGroup:%sbSpec IrfSeg ENDS %IF (%LEN(%attr) NE 0) THEN ( DATA SEGMENT BYTE PUBLIC 'DATA' PUBLIC iInitRun%at tr iInitRun%attr DW %cIrf Data ENDS )FI %SET(cIrf,%cIrf+1) ) %*DEFINE(InitRunFilePassword("password")) ( DATA SEGMENT BYTE PUBLIC 'DATA' PUBLIC sbInitRunPswd sbInitRunPswd DB %LEN(%password), '%password' DATA ENDS %SET(cIrf, 0) IrfSeg SEGMENT PARA PUBLIC 'MEMORY' IrfSegStart LABEL BYTE IrfSeg ENDS IrfStringSeg SEGMENT BYTE PUBLIC 'MEMORY' IrfStringSeg ENDS InitGroup GROUP IrfSeg, IrfStringSeg ) %*DEFINE(InitRunFileEnd) ( IrfStringSeg SEGMENT BYTE PUBLIC 'MEMORY' IrfEnd LABEL BYTE IrfStringSeg ENDS DATA SEGMENT BYTE PUBLIC 'DATA' ; Boot chain-sequence variables - PUBLIC prgoSbInit, cbInitRunSeg PUBLIC iInitRun, iInitRunLast PUBLIC exitRunFilePrio, fInitExit, fDumpOccurred iInitRun DW 0 iInitRunLast DW %cIrf-1 cbInitRunSeg DW OFFSET InitGroup:IrfEnd prgoSbInit DD InitGroup:IrfSegStart exitRunFilePrio DB 80h fInitExit DB 0FFh fDumpOccurred DB 0 DATA ENDS ) %*Define(DefaultDebugPort(Proc,bPort))( Public rgbDefaultProcessor,DefaultDBGPort rgbDefaultProcessor DB '%Proc' DefaultDBGPort DB '%bPort' EVEN ) $EJECT %*Define(ScratchVolumeSpec("name"))( PUBLIC sbScratchVolumeSpec sbScratchVolumeSpec DB %LEN(%Name), '%Name' DB %EVAL(12-%LEN(%Name)) DUP (0) EVEN ) %*Define(DefaultCnfgFile("file"))( PUBLIC cbDefaultConfigFile, rgbDefaultConfigFile rgbDefaultConfigFile DB '%file' DB 0 ; Used to pass cbConfigFileName to other boards. cbDefaultConfigFile DW %Len(%file) EVEN ) %*Define(ConfigurationFile("name" , "password"))( CONST SEGMENT WORD PUBLIC 'DATA' PUBLIC sbConfigFileSpec, sbConfigFilePswd sbConfigFileSpec DB %LEN(%Name),'%Name' DB %EVAL(92-%LEN(%Name)) DUP (0) sbConfigFilePswd DB %LEN(%Password),'%Password' DB %EVAL(12-%LEN(%password)) DUP (0) CONST ENDS EVEN ) %*Define(WsConfigurationFile("name"))( PUBLIC sbWsConfigFileSpec sbWsConfigFileSpec DB %LEN(%Name),'%Name' EVEN ) %*Define(HwConfigurationFile("name"))( PUBLIC sbHwConfigFileSpec sbHwConfigFileSpec DB %LEN(%Name),'%Name' EVEN ) %*Define(NlsFileSpec("name" , "password"))( PUBLIC sbNlsFileSpec, sbNlsFilePassword sbNlsFileSpec DB %LEN(%Name),'%Name' sbNlsFilePassword DB %LEN(%Password),'%Password' EVEN ) %*Define(WsNLSFileSpec("name"))( PUBLIC sbWsNLSFileSpec sbWsNLSFileSpec DB %LEN(%Name),'%Name' EVEN ) %*Define(NlsKbdFileSpec("name" , "password"))( PUBLIC sbNlsKbdFileSpec, sbNlsKbdPassword sbNlsKbdFileSpec DB %LEN(%Name),'%Name' sbNlsKbdPassword DB %LEN(%Password),'%Password' EVEN ) %*Define(WsNlsKbdFileSpec("name"))( PUBLIC sbWsNlsKbdFileSpec sbWsNlsKbdFileSpec DB %LEN(%Name),'%Name' EVEN ) $EJECT %*Define(SetSwapFileInfo)( swapFileSize DW %eval(%cKSwapFile*1024),%eval(%cKSwapFile/64) ; following 4 offsets are a structure known by page service swapFileNameInfo LABEL BYTE PUBLIC swapFileNameInfo DW OFFSET DGroup:sbSwapFileTryEachPswd DW OFFSET DGroup:sbSwapFileTryFirstPswd DW OFFSET DGroup:sbSwapFileTryEach DW OFFSET DGroup:sbSwapFileTryFirst sbSwapFileTryEachPswd DB %LEN(%SwapFileTryEachPswd), '%SwapFileTryEachPswd' sbSwapFileTryFirstPswd DB %LEN(%SwapFilePswd), '%SwapFilePswd' sbSwapFileTryEach DB %LEN(%SwapFileTryEach), '%SwapFileTryEach' DB %EVAL(92-%LEN(%SwapFileTryEach)) DUP (0) sbSwapFileTryFirst DB %LEN(%SwapFile), '%SwapFile' DB %EVAL(92-%LEN(%SwapFile)) DUP (0) %SET(ib, 0) %WHILE (%NES(%substr(%SwapFileTryEach,%ib+1,2),00) AND (%ib NE %LEN(%SwapFileTryEach))) ( %SET(ib, %ib+1) ) %IF (%ib EQ %LEN(%SwapFileTryEach)) THEN (%SET(ib, %ib-2))FI ibSwapFileNumber DW %ib ) $EJECT %*Define(DefineXbusModule(id,cK,fRMOS,fMode3Master))( %IF (%m_iModDescMax EQ 0) THEN ( PUBLIC rgModDesc rgModDesc LABEL WORD ) FI DB %id DW %cK DB %fRMOS DB %fMode3Master %SET(m_iModDescMax, %m_iModDescMax+1) ) %*Define(DefineLibSearchPath("pathname")) LOCAL oLink ( %oLink EQU THIS BYTE DW OFFSET DGROUP:%oLink + %LEN(%pathName) + 3 DB %LEN(%pathName) DB '%pathName' %IF (NOT(%*Isdef(%oFirstPath))) THEN ( %Define(oFirstPath) (%oLink) )FI %SET(oLastPath, %oLink) ) %*Define(EndLibSearchPath) ( EndPathInfo LABEL BYTE ORG %oLastPath DW 0 ORG OFFSET EndPathInfo PUBLIC pLibSearchPathHead pLibSearchPathHead DD %oFirstPath ) ; ; final -- set counters in various tables, create gen table. ; %*DEFINE (Final)( %IF (%PASS1) THEN ( ; see InitKernel(KernalSetup) and Init82380 for the derivation. %SET(nExch, %m_SysExch+1 + %nUsrExchange) %SET(sMinosData, (%nPcb*18) + (%nExch*8) + (%nExch*2) + (%nMsgWait*10) + (%nPTiming*4) + (%nUcb*42) + (%nUcb*2) + (%nPTiming*2) + (%nSoftVec*12) + (%nPcb*22) + (%nUcb*5) + (%m_nOSProcDesc*2) + 4 + (%nDmaIob*34) + %sOsProcStacks + 1150 ; bus tables, null proc stack, misc ) %Out( current sOsData %sOsData minimum recommended sOsData %sMinosData ) )FI %RtcRq(bellRq,0,0,0,1,64)%' ; for beeper ' %IF(%fKbdRes)THEN( %RtcRq(rqTimeKbd,0,0,0,1,63)%' ; for repeat key' %RtcRq(rqTimeVid,0,0,0,1,63)%' ; for Video timeout blank' )FI %IF (%ctosv) THEN ( %RtcRq(trbGInfoSet,0,0,0,0,0)%' ; for updating GInfoSeg' )FI m_temp label byte org offset nOsProcDesc DW %m_nOsProcDesc org offset nSoftwareInt DW %m_nSoftwareInt org offset nExchg DW %m_SysExch+1 + %nUsrExchange org offset userExchFirst DW %m_SysExch+1 org offset m_temp %IF (%m_nSoftwareInt EQ 0) THEN (rgSoftwareIntDesc label byte) FI %IF (%m_nInitProcHardware EQ 0) THEN (rgInitProcHardware label byte) FI %IF (%m_nInitProcIntDisable EQ 0) THEN (rgInitProcIntDisable label byte) FI %IF (%m_nInitProcIntEnable EQ 0) THEN (rgInitProcIntEnable label byte) FI %IF (%m_nSetIntHandler EQ 0) THEN (rgSetIntHandler label byte) FI %If (%m_nRgInitRtcRequest EQ 0) Then (rgInitRtcRequest Label Byte) FI %If (%m_iModDescMax EQ 0) Then (rgModDesc Label Byte PUBLIC rgModDesc) FI EVEN nRgInitRtcRequest DW %m_nRgInitRtcRequest nInitProcHardware DW %m_nInitProcHardware nInitProcIntDisable DW %m_nInitProcIntDisable nInitProcIntEnable DW %m_nInitProcIntEnable nSetIntHandler DW %m_nSetIntHandler PUBLIC nRgMassIo nRgMassIo DW %m_nRgMassIo PUBLIC initSysDevNum initSysDevNum DW %IF (%*IsDef(%SysDevNum)) THEN (%SysDevNum) ELSE (0FFFFh)FI %IF(%fSrp) THEN ( PUBLIC fCheckMem, fCheckEcc fCheckMem DB %fCheckMem fCheckECC DB %fCheckEcc )FI PUBLIC iModDescMax iModDescMax DW %m_iModDescMax PUBLIC fSFNM fSFNM DB %IF(%fSpecialFullyNestedMode) THEN (0FFh) ELSE (0)FI %' create gen structure %CreateGen data ENDS ); end macro Final $EJECT ; ; when an error is detected this macro is called ; %*DEFINE (m_Error (msg)) (%SET(m_ErrorCount, %m_ErrorCount + 1) $SAVE LIST ;*** SYSGEN ERROR -- %msg *****ERROR***** $RESTORE %OUT(SYSGEN ERROR -- %msg )) %*DEFINE (Error (msg)) (%m_Error (%msg)) %*DEFINE(Warning(str))(%IF (%PASS1) THEN (%Out( Warning - )%out(%str)) FI) ; ; end of file sysgen.mdf ; DUP (0) sbConfigFilePswd DB %LEN(%Password),'%Password' DB %EVAL(12-%LEN(%password)) DUP (0) CONST ENDS EVEN ) %*Define(WsConfigurationFile("name"))( PUBLIC sbWsConfigFileSpec sbWsConfigFileSpec DB %LEN(%Name),'%Name' EVEN ) %*Define(HwConfigurationFile("name"))( PUBLIC sbHwConfigFileSpec sbHwConfigFileSpec DB %LEN(%Name),'%Name' EVEN ) %*Define(NlsFileSpec("name" , "password"))( PUBLI;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: Sysgen.asm *; ;* *; ;* MACHINE: B20 LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION:  *; ;* *; ;* System generation variables. *; ;* *; ;* *; ;* HISTORY: *; ;*  *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;*  *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1990 CONVERGENT INCORPORA TED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1990 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; The files "SysGen.Mdf" and "SysGen_Common.mdf" contain the definitions for ; the macros which are used in this file, "SysGen.Asm". The intent is to make ; changing the system build parameters as painless as possible, and so this ; file has been created using macros which provide a high degree of ; readability and allow the user to ignore the Assembly language constructs ; which are actually generated. The prefix files and SysGen.Asm contain macros ; which generate several types of data: ; ; 1. "Static" tables and variables which are allocated at link time. ; These may be part of "DGroup", or they may be in other segments. ; 2. "Dynamic" tables and variables which are allocated at run time. ; These also may be in "DGroup" or other segments. ; 3. "Initial" tables and variables which will be discarded after CTOS ; initialization is completed. ; ; CONFIGURATION -- ; This module uses several macro symbols to determine the configuration which ; is to be built. The prefix files (e.g. pSrvrM.Asm, pClstr.Asm, FsM_N.asm) ; set these symbols, and then include the SysGen.Asm, SysGen.Mdf and ; SysGen_Common.mdf modules. When invoking the Assembler, list only the name ; of the prefix file. ; ; DEBUGGER OPTIONS -- ; To simplify removal of the optional debugger, the flag fDebugger is used. ; This is set to TRUE (1) unless the prefix file sets it explicitly. To ; remove the debugger, set the flag to FALSE (0) in the appropriate prefix ; file. NOTE: You must also change the appropriate .fls file (e.g. ; pSrvrM.fls) as described in the "Building a Customized CTOS" section of the ; CTOS System Administration Guide or CTOS II 3.3 Software Release ; Announcement (SRA). ; ; NOTES FOR CHANGING THIS FILE -- ; ; Please be aware that in the Convergent Assembly language there are two types ; of comments, normal comments, (any text on a line after a ";" character), ; and a macro comment (%' text '). It is not possible to "comment out" a ; macro by inserting a ";" in front of it. You may comment out a macro by ; replacing the percent sign in the call with a ";" or by preceeding the call ; with "%'". This will cause the macro processor to ignore any text up to and ; including the next "'" or RETURN (0Ah) character, whichever comes first. ; Macro calls must not be mixed. In general the invocation of a macro causes ; an entry to be added to a table, and mixing macro calls would result in ; scrambled tables. ; ; In most cases, you will not change this file at all, but rather will change ; the SET macros contained in the prefix file (e.g. pSrvrL.Asm or FsL_N.Asm). ; The meaning and effect of these SET macros is explained below. ; ; ; SET AND CONFIGURATION MACROS USED IN THIS FILE -- ; ; The following macros are used to control the conditional ; statements in this module: ; ; WsType ............. 7: NGEN Cluster ; 8: NGEN ; 9: NGEN Server (Master) ; 10: FP ; 11: TP ; 12: CP ; 13: SP ; 14: DP ; 19: BT ; 20: GP ; 21: GP+SI ; 22: GP+CI ; ; HardwareType ....... 4: NGEN ; 10: FP ; 11: TP ; 12: CP ; 13: SP ; 14: DP ; 19: BT ; 20: GP ; 21: GP+SI ; 22: GP+CI ; ; ClusterConfig ...... 0: Standalone workstation ; 1: Cluster workstation ; 2: Cluster server (master) ; ; fNoFileSystem ...... 0: Any workstation with a filesystem ;  1: Cluster stations without filesystems ; ; fDebugger .......... 0: Exclude debugger ; 1: Include debugger ; ; fHDisks ............ 0: No hard disks ; 1: Include hard disks ; ; CTOSP .............. 0: real mode Mp (CTOS Mp) ; 1: protected Vp (CTOS VM) ; ; fMulpar ............ 0: Single-partition OS. Obsolete. ; 1: Multi-partition OS. Always set true. ; ; fVarpar ............ 0: Multi-partition OS. ; 1: Variable-partition OS. Always set same as CTOSP. ; ; COMPILATION FLAGS AND SYSTEM BUILD PARAMETERS. ; ; Many of these parameters control the allocation of structures when the OS is ; initialized. The memory for many of these structures is dynamically ; allocated from a fixed size buffer in the data segment (DGroup). The OS is ; shipped with this buffer set to its maximum possible size. If it were any ; larger then the data segment would exceed 64K and the OS wouldn't link. If ; too many structures are allocated then the OS will crash with an ERC 101 at ; boot. The only recourse is to reduce the number of structures allocated. ; This is done by reducing the counts in SET macros listed below. ; ; Many parameters may now be set in the configuration files, circumventing the ; need to rebuild an Operating System. The configuration files are ; Config.sys, Ws>Config.sys and WsNNN>Config.sys. Refer to the CTOS System ; Administration Guide or CTOS II 3.3 SRA for more information. ; ; The "Set" macros placed in the "prefix" file are defined as follows: ; ; OS Build Parameters ; ; sOsData ............ Reserves an empty buffer in the OS data segment ; (DGroup) which is used for dynamic allocation. ; The OS uses this space for data structures, such ; as exchanges, which are allocated at run time ; according to parameters set in the prefix file. ;  If configuration changes are made which increase ; the static data size, sOsData may need to be ; smaller. If more dynamic memory is needed then ; the static data size must be decreased and ; sOsData increased. NOTE: The File System, ; Cluster Agent and Operating System have separate ; data segments, each of which must not exceed 64kb. ; ; sContingencyLog .... Stray interrupt log (minimum value is 1 word) ; ; sKbdBuffer ......... Keyboard type ahead buffer (must be a power of 2) ; ; sOutBuffer ......... Size in bytes of the output character buffer. ; This size must be a power of 2. The output ; buffer is used by SRPs in administrator mode. ; ; nUsrExchange ....... User Exchanges (maximum 200). ; Each adds 10 bytes. ; ; nPcb ............... Number of processes (CTOS and user combined). ; The largest standard OS has 12, character mapped ; video has 1, and the Executive has 2, making a ; minimum of 15. Each adds 40 bytes. ; ; fTimeSlice ......... 0: disable run-queue rotation. ; 1: enable run-queue rotation. ; When enabled, pcbs in a certain priority range on ;  the run queue are relinked behind other pcbs of ; the same priority ten times per second. ; ; lbTimeSlicePriority when fTimeSlice is 1, sets low bound ; priority of pcbs to rotate. ; ; hbTimeSlicePriority when fTimeSlice is 1, sets high bound ; priority of pcbs to rotate. ; ; nMsgWait ........... Total number of message link blocks. ; Each adds 6 bytes to CTOS. ;  ; nPTiming ........... Total number of simultaneous real time clock ; service requests. CTOS requires at least 16 to ; run all Convergent programs. Each adds 6 bytes. ; ; nPartitions ........ Number of user numbers max. Changing this number ; causes some defaults to also be changed. See the ; prefix file. ; ; nUcb ............... Number of user control blocks. Each is 95 ; bytes. Set to nPartitions always. ; ; nFixup ............. Must be equal to the total number of outstanding ; route-by-file-handle requests to multi-instance ; servers. Increase if error 156. ; ; nDeviceHandle ...... The total number of simultaneous open multi- ; instance file handles. Increase if error 157. ; ; sParExitRunFile .... The minimum size in paragraphs (16 bytes) ;  that the primary partition will shrink ; to due to CreatePartition and ConvertToSys ; requests. ; (May also be changed in configuration file) ; ; cParScHeap ......... The size in paragraphs of the installable ; system common subroutine heap. Each ; installed routine requires at least 8 bytes. ; (May also be changed in configuration file) ; ; nGDTSlots .......... Number of slots in the Global Descriptor Table. ; Each slot takes 14 bytes. This table is ; allocated out of high memory, not OS DGroup. ; ; nSwapFabs .......... Number of Swap File Area Blocks needed for ; swap file management. These are not the same ; blocks as set by nFab. Each takes 6 bytes. ; ; SwapFile ........... Name of the default preferred swap file. ; This is normally [Sys]Crashdump.Sys. ; (May also be changed in configuration file) ; ; ; Cluster Agent parameters are defined as follows: ; ; nWsUserNum ......... Number of workstation user numbers. There is a ; user number required for each partition in each ; cluster workstation. SRP only. ; ; nXBlk .............. Number of transmission blocks (XBlocks). ; Each requires sXBlk (see below) + 32 bytes. ; On a server this should be a function of the ; number of cluster workstations. ; (May also be changed in configuration file) ; ; nSectorPerXBlock ... SRP: This is obsolete, see sXBlk below. ; For old workstations which still use this ; parameter, sXBlk on the SRP should be calculated ;  as shown below. Extra bytes will be wasted. ; ; sXBlk .............. The maximum size (in bytes) of a request that ; will fit in a XBlock. This is the total size of ; the request block and all request and response ; data. Prior to CTOS/SRP 3.0 this was set using ; nSectorPerXBlock. ; For conversion, sXBlk = (512*nSectorPerXBlock)+64. ;  (May also be changed in configuration file) ; ; nXBlkSmall ......... Number of small transmission blocks. ; Each requires sXBlkSmall (see below) + 32 bytes. ; Requests received from cluster workstations that ; fit in a small XBlock will not take up a large ; XBlock on the server. This is useful for ; applications that have small requests that may be ; outstanding at the server for long periods of ; time. ; (May also be changed in configuration file) ; ; sXBlkSmall ......... The maximum size (in bytes) of a request that ; will fit in a small XBlock. ; Prior to CTOS/SRP 3.0 this was sMaxSmallRq. ; (May also be changed in configuration file) ; ; wsTotal ............ Total number of workstations that may be attached ; to the server. ; ; nWsLine1 ........... Maximum number of cluster workstations which may ; be attached to channel 1 of the CP or GP, or to ; the single cluster channel on a workstation. ; (May also be changed in configuration file) ; ; nWsLine2 ........... Maximum number of cluster workstations which may ; be attached to channel 2 of the CP or GP. ; (May also be changed in configuration file) ; ; nUserNum ........... The maximum number of users that can be ; supported by this server. Allocate one user ; number for each local user (nPartition) plus one ; for each possible cluster user. ; ; nRcb ............... The number of Request Control Blocks. ; Workstations: Rcbs are used by cluster ; workstations to record the existence of ; outstanding requests to the server. ; Each Rcb requires 24 bytes. ; ; nRepollActive....... Obsolete: The number of times to repoll cluster ; workstations within a poll cycle. ; (May also be changed in configuration file) ; ; nClusterTimeout .... The amount of time a workstation waits ;  before giving up on the master (erc 6). ; ; nTryNewMaster ...... The number of times a workstation waits before ; getting a new SNRM (new SNRMs, workstation IDs, ; have numbers greater than 16). ; ; ; ; OS Build Parameters which only effect the SRP ; ; c4kPagesMBusWindow . GP,SI,CI only. The number of 4k pages ; to be used to map the megabus from a ; GP board. 1 page must be allocated for ; each 4MB of RAM on the largest other board ; on the bus. For example, if another GP ; has 64MB then allocate 16 pages. If all ; other boards are 186 boards then only 1 page ; is needed. ; ; nRcb ............... The number of Request Control Blocks. ; SRP: Used for ICC, each rcb adds 18 bytes. ; ; nWblk .............. Number of very large ICC request blocks. Used to ; hold requests that don't fit in a YBlk. Usually ; 0. Each requires sWBlk (see below) + 16 bytes. ; (May also be changed in configuration file) ; ; sWblk .............. Size (in bytes) of a WBlk. ; (May also be changed in configuration file) ; ; nYblk .............. Number of large ICC request blocks. ; Used to hold remote requests. ; Each requires sYBlk (see below) + 16 bytes. ; (May also be changed in configuration file) ; ; sYBlk .............. Size (in bytes) of a Yblk. ; This must be at least as large as sXblk. ; (May also be changed in configuration file) ; ; nZblk .............. Number of small ICC request blocks. ; Used to hold remote requests. ;  Each requires sZBlk (see below) + 16 bytes. ; (May also be changed in configuration file) ; ; sZblk .............. Size (in bytes) of a Zblk. ; (May also be changed in configuration file) ; ; nMountedDisks....... Maximum number of disks which may be attached to ; the processor. Fp/Dp/Gp+Si only. ; ; nReqEnts ........... Size of the ICC input request circular buffer. ;  Each is five bytes. ; ; nRespEnts .......... Size of the ICC input response circular buffer. ; Each is 5 bytes. ; ; sStatArea .......... Size of the ICC statistics ares. A ; minimum of 10 bytes is recommended ; ; nLine .............. Number of configured RS-422 lines ; on a CP or GP. Values of 1 or 2 are OK. ; ; fSrpClock1 ......... Line speed of RS-422 line #1. A ;   value of 0FFh indicates the 1.8Mbs ; speed while 0 indicates 307kbs. ; (May also be changed in configuration file) ; ; fSrpClock2 ......... As above, but for line #2. ; (May also be changed in configuration file) ; ; nAdapters .......... Maximum number of multibus adapters in SRP ; system. If omitted, a default of 1 is assumed. ; ; nNetUsers .......... The maximum number of CtNet users that can be ; supported by this workstation. ; ; fCheckECC .......... If set to FALSE, memory ECC (Error Correction) ; will not be tested during initialization. It is ; recommended that this always be set TRUE. ; ; fCheckMem .......... If set to FALSE, memory will not be tested during ; initialization. It is recommended that this ; always be set TRUE. (SRP 186 processors only) ; ; sTpInBuf,sTpOutBuf . Size of input and output buffers for the ; communication ports on the TP. ; ; ; ; File System Build Parameters. These only affect file system builds. ; ; fVerifyFileStruct .. If this is non zero then CTOS will verify file ; structures after writing to disk. Adds 512 ; bytes. Halves file system performance. ; (May also be changed in configuration file) ; ; cDiskLogThreshold .. Indicates how many disk retry operations are to ; be attempted before logging the disk error. Only ; applies to errors that are subject to retries. ; This value can be greater than the total number ; of retries done, thereby inhibiting log entries. ; (May also be changed in configuration file) ; ; nIob ............... Total number of simultaneous disk I/O requests ; allowed. CTOS requires at least as many as disk ; devices in the system to run all Convergent ; programs. Less than 5 IOBs per disk limits ; performance. Each IOB adds 128 dynamic bytes to ; DGroup. ; ; nFab ............... Total number of "runs" allowed for all open files ;  combined. The appropriate number is highly ; dependent on the frequency of file creation, ; deletion, and expansion, and on the frequency ; with which you reload your disk volumes. Each FAB ; adds 10 dynamic bytes (In own segment if linked ; with HfsUfb2, in DGroup otherwise). ; ; nFcb ............... Total number of unique open files allowed in the ;  system. Each FCB adds 32 dynamic bytes (16 in ; DGroup and 16 in another segment). ; ; nFub ............... Number of file user blocks (one is required for ; each outstanding file handle). If linked with ; HfsUfb2, FUBs are 15 bytes each and are ; dynamically allocated in their own segment. If ; linked with HfsUfb, FUBs are 5 bytes and are ; dynamically allocated in DGroup. ; ; nScsiIob ........... Total number of simultaneous SCSI I/O requests ; allowed. CTOS requires at least as many as disk ; devices in the system to run all Convergent ; programs. Each ScsiIob adds 66 dynamic bytes to ; DGroup. ; ; nUpb ............... Total number of open SCSI paths allowed in the ;  system. Each adds 16 dynamic bytes to DGroup. ; ; nLucb .............. Total number of active SCSI Logical Units allowed ; in the system. Each adds 74 bytes to DGroup. ; ; nFloppy ............ Total number of floppy disks in the system. Each ; floppy present at boot time requires 98 bytes. ; ; nDisk .............. Total number of rigid disks in the system. Each ; disk present at boot time requires 98 bytes. ; ; nMemDisk ........... Total number of memory disks in the system. Each ; memory disk declared at system generation ; requires 98 bytes. ; ; nVhb ............... Total number of mountable mass storage ; devices (disks) in the system. Each ; requires 256 bytes. ; ; cbNameSpace ........ Size of the name heap used for caching file names ;  and passwords to increase performance. Allocated ; dynamically in own segment. ; NOTE: cbNameSpace MUST NOT EXCEED 65000. ; ; The following parameters may be set in the prefix file or defined in this ; file, but Convergent recommends they NOT BE CHANGED. ; ; WARNING: Changing these parameters may cause unknown results. ; ; TeleclusterTiming .. Timing parameter for SRP TeleCluster. DO ; NOT CHANGE. ; ; nFrames ............ Number of simultaneous video frames. ; ; maxMedInterruptType Maximum type number of all mediated interrupts. ; ; XBlockHeaderSize.... Equals the maximum request block size. ; ; fCommIOP ........... 0: Any workstation but Comm-IOP master ; 1: CommIOP-cluster master. IWS only. ; ; ; The following parameters are included in this file, but THEY ARE OBSOLETE. ; They remain in this file because they are declared as publics. ; ; lineHz ............. This is the AC line frequency, used by the real ; time clock (50Hz or 60Hz). ; ; nSysExchange ....... Exchanges reserved for CTOS. ; ; nMsgWaitReserve .... Number of message link blocks ; reserved for CTOS "pSend" primative. ; ; nSectorPerXBlkFst .. For an NGen master, if a high speed line is ; specified in Config.Sys (:ClusterLineSpeed: ; 1.8mbps), the number of sectors in each ; transmission block will be taken from ; nSectorPerXBlkFst instead of nSectorPerXBlk. ; ; sioClock ........... Sio Clock divisor. It is the ; divisor of 1,228,800 baud. (4 for ; 307200 baud). This is now a parameter in ; [Sys]Config.Sys - for workstations. ; ; fIopDump ........... Crashdump the IOP on load. IWS only. ; ; nIops .............. Number of IOP's. IWS only. ; ; nWsLine3 ........... Maximum number of workstations which may be ; attached to channel 1 of IOP 2. IWS only. ; ; nWsLine4 ........... Maximum number of workstations which may be ; attached to channel 2 of IOP 2. IWS only. ; ; FontRamBuf ......... 0FFh indicates that 8704 bytes buffer is reserved ; at low memory for LoadFontRam operations. IWS ; only. ; ; ;############################################################### ; Encryption Key value ; Used by the file system to encrypt all passwords on disk. ; If changed, encryption-protected disks will be incompatible with ; disks created by previous file systems. ; ; The encryption process is loosely based on the RSA public-key method. ; This number cannot be replaced by an arbitrary byte string. ; The key is part of a function that takes an un-encoded password ; string as input and procuces an encrypted password as output. ; User-generated keys should exceed 80 bytes (200 digits) and be, if not ; prime, then have only a few factors. The more factors, the more ; plain text strings will encrypt into the same encoded string. ; ; Password encryption is on a per-volume basis. The user chooses the ; option at ivolume time. Care in remembering passwords must be exercised, ; as it is impossible to determine the plain text string when only the ; encrypted string and the key are known. ;################################################################ %DefineEncryptionKey(%( 7C8Dh, 1813h, 9F31h, 4BB9h,0E569h, 29F1h, 1B89h,0AD7Bh, 973Fh, 101Bh, 54FCh,0C922h, 5C63h, 9C97h, 840Ah, 06F0h, 612Dh,0DFCAh,0D3F7h, 335Bh,0D421h,0CD61h, 324Fh,0E40Eh, 0B0Bh, 6CE9h, 80D3h, 90BAh, 74A9h, 10E2h, 8C96h, 9CA6h,0C506h, 568Ah,0AD6Ah, 23BBh, 26A2h,0C0F9h,0A2CFh,0F383h, 0B05h, 1A7Eh,0C31Ah,0C9ACh, 8F67h, 4D69h, 083Dh, 44EEh )) ;###################################################### ######### ; Specify the name of a volume which is designated as the ; volume [Scr]. This is the volume where the spooler is ; going to create temporary files. ; (May also be changed in configuration file) ;################################################################ %IF(%*isdef(%ScratchVolume)) THEN ( %ScratchVolumeSpec("%ScratchVolume") ) ELSE ( %ScratchVolumeSpec("Sys") )FI %IF(%fVarPar) THEN ( ;############################################################### ; ; SwapFile(filename) ; SwapFilePswd(password) ; SwapFileTryEach(filename) ; SwapFileTryEachPswd(password) ; cKSwapFile(size) ; ; These macros define the name of a file which CTOS uses ; when it becomes necessary to write a running program onto disk. ; ; The file mentioned in SwapFile is tried first. The file ; must be at least as large as the default create size (cKSwapFile). ; If it cannot be opened or is too small, then SwapFileTryEach is tried. ; Each time a decimal number is inserted into the name at the position ; where '00' occurs. If the file is in use, the next is tried. ; If the file couldn't be opened a Create is tried. If the create ; fails, the OS crashes with ercNoSwapFile. ; ; The file is created with size as specified by cKSwapFile. ; Size is measured in kilobytes(1024 byte blocks). A size of 512 would ; create a swap file of 1/2 megabyte. ; ;################################################################ %IF(not (%*isdef(%SwapFile))) THEN ( %define(SwapFile)([Sys]CrashDump.Sys) )FI %IF(not (%*isdef(%SwapFilePswd))) THEN ( %define(SwapFilePswd)() )FI %IF(not (%*isdef(%SwapFileTryEach))) THEN ( %define(SwapFileTryEach)([Sys]SwapArea00.Sys) )FI %IF(not (%*isdef(%SwapFileTryEachPswd))) THEN ( %define(SwapFileTryEachPswd)() )FI %IF(not (%*isdef(%cKSwapFile))) THEN ( %define(cKSwapFile)(1500) )FI %SetSwapFileInfo )FI %IF (%ctosv) THEN ( ;################################################################ ; the DefineLibSearchPath macro defines a search path used when a library is ; loaded. There may be multiple search paths, the order listed below is the ; order in which the search is performed. The password of the path may be ; included in the spec. There must be at least one search path defined. ;################################################################ %DefineLibSearchPath("[Sys]") %DefineLibSearchPath("[Sys]") %EndLibSearchPath )FI ;############################################################### ; SysGen Description of Interrupt handlers. %IF (0) THEN ( ; ; REAL MODE INTERRUPT DECLARATIONS ; ; NOTE: OS's built with this SysGen DO NOT support real mode processors. ; The comments pertaining to interrupts on real mode processors ; have been left in solely for clarity and reference. ; ; In real mode, SysGen defines interrupt handlers as either ; "raw" and "mediated". ; ; ; RAW INTERRUPTS -- A "raw" interrupt handler is a routine to ; which control is passed by the 80186 CPU when the interrupt ; occurs. It is the responsibility of the handler to save the ; current register context, and to restore context before ; executing an interrupt return. A raw interrupt may be ; generated by hardware (through the 8259A interrupt chip) or ; by software (with an "int" or an "int nn" instruction). ; ; ; RAW INTERRUPT DECLARATION -- To declare a raw interrupt ; handler use the macro "RawInterrupt" with two arguments, the ; 80186 interrupt type, and the name of the public procedure ; which will handle the interrupt. Note that a raw interrupt ; handler must save the user context (registers), and should ; return with the "iret" Assembly Language instruction. The ; effect of executing this macro is to have the CS:IP of the ; handler put into the pointer associated with the interrupt ; type: ; ; RawInterrupt(type,pHandler) ; ; ; MEDIATED INTERRUPTS -- A "mediated" interrupt is one which ; CTOS "mediates" for the user, by saving the current register ; context, and then calling the interrupt handler as a ; subroutine. This is especially useful because it allows ; FORTRAN and Pascal procedures to be written as interrupt ; handlers. A "mediated" interrupt may be generated by ; hardware or software, just as with the "raw" interrupts. ; ; ; MEDIATED INTERUPT DECLARATION -- To declare a mediated ; interrupt handler, use the macro "MediatedInterrupt" with ; three arguments, the interrupt type, a flag (0 or 0FFh) ; saying whether or not the interrupts are generated by ; hardware (whether to do EOI), and the name of the interrupt handler. ; CTOS will use the macro declarations to build a table which ; it will use to service interrupts: ; ; MediatedInterrupt(type,fHardware,pHandler) ; )FI %IF (%CtosP) THEN ( ; ; PROTECTED MODE INTERRUPT DECLARATIONS ; ; In protected mode, SysGen defines interrupt handlers as either ; "software" or "hardware". ; ; ; SOFTWARE INTERRUPTS -- A software interrupt occurs in response to ; a software generated event, such as an INT instruction or a ; program exeception, such as a general protection fault. IDT entries ; for software interrupts contain task gates, hence, a software ; interrupt causes a task switch. The interrupt handler need not save ; registers since a task switch occurred. The interrupt handler may ; return to the interrupted task using IRET or may return to the ; kernel dispatcher using RET, behaving as a mediated interrupt. ; ; ; HARDWARE INTERRUPTS -- A hardware interrupt occurs in response to ; a external hardware interrupt. IDT entries for hardware interrupts ; contain interrupt gates. The CS:IP in the interrupt gate passes control ; to code that immediately calls an interrupt task, hence, a task switch ; occurs. This two level vector is required to force the processor to ; unlock the memory bus during the time period beginning at the start of ; the interrupt acknowledge cycle and ending with the task switch. Freeing ; the memory bus is necessary for high performance RS-422 cluster operation. ; The interrupt handler need not save registers since a task switch occurred. ; The interrupt handler may return to the interrupted task using IRET or may ; return to the kernel dispatcher using RET, behaving as a mediated interrupt. ; When using IRET, the interrupt handler must do EOI programming itself. When ; RET is used the kernel handles EOI programming, and the interrupt handler ; must not do the EOI itself. ; ; ; INTERRUPT LEVEL -- The 80x86 interrupt level (type) is a code which the CPU ; uses to distinguish different interrupts. Interrupts may be generated in ; one of four ways. First, the CPU may generate the interrupt itself ; (division error, overflow, after every instruction if TF is enabled, GP ; fault, etc). Second, a Non Maskable Interrupt (NMI) may occur, signaling ; some catastrophic error such as power failure, bus timeout or parity error. ; Third, a maskable hardware interrupt can be generated by the 8259A interrupt ; controller chips. Fourth, any level interrupt may be generated by software ; using the INT instruction. The level is used by the CPU to map the ; interrupt to the IDT (interrupt descriptor table) which contains the "CS:IP" ; of the appropriate interrupt handler. On 80186 processors, the IDT is ; located at physical address 0, and each entry is 4 bytes, starting with ; level 0 at 0000:0000h, level 1 at 0000:0004h, etc. On 80286 and later CPUs, ; the IDT can be anywhere, and the entries are 8 bytes each. Certain ; interrupt levels are reserved by Intel, and may not be changed. ; ; ; SOFTWARE INTERRUPT DECLARATION -- To declare a software interrupt ; handler use the "SoftwareInterrupt" macro: ; ; SoftwareInterrupt(iLevel,Handler,sStack,fEnable) ; ; iLevel - the interrupt level (see below) ; Handler - name of public procedure which will handle the interrupt ; sStack - the count of bytes of the stack for the handler ; fEnable - a flag indicating whether or not interrupts are to be ; enabled when the handler is invoked ; ; ; HARDWARE INTERUPT DECLARATION -- To declare a hardware interrupt handler, ; use the "HardwareInterrupt" macro as described below. ; ; ; ADDING HANDLERS -- In addition to adding the macro ; declaration of an interrupt handler, you must link CTOS with ; the object module containing the handler. The handler should ; be written following the conventions outlined in the Assembly ; Language Manual (appendix) relating to register BP usage, ; segment names, etc. ; ; ; NON DECLARED INTERRUPTS -- Any interrupt which occurs of a ; type for which an interrupt handler is not supplied will ; cause CTOS to generate a "crash", which is described in the ; CTOS manual. ; ; ; REFERENCES -- Furthur information on interrupt handlers may ; be found in the following documents: ; ; CTOS Operating System Concepts Manual ; Assembly Language Manual, appendix on programming conventions ; Specific hardware reference manuals (e.g. 386i Technical Reference Manual) ; Specific Intel manuals (e.g. Intel 80386 Programmer's Reference Manual) ; ; ; Interrupt handlers: ; ; SKULL AND CROSSBONES ; ; EXTREME CAUTION IN CHANGING THE ORDER OF SOFTWARE INTERRUPTS ; ; All interrupt tasks that are entere d with an error code must be ; defined BEFORE other interrupt tasks. The last such task must be the ; GP fault handler. ; ; The kernel identifies interrupt tasks that are entered with an error ; code using the predicate sgTss <= sgTssGpFault. ; ; ** NOTE ** ; The parameter sStack (stack size in bytes) should be OR'd with 8000h to ; signal the operating system to place the stack for this interrupt ; handler in low memory. This is so real mode programs can use this interrupt ; level. ; Interrupt tasks entered WITH an error code. %SoftwareInterrupt(8, DoubleTaskFault, 160, 0) %SoftwareInterrupt(10, InvalidTssFault, 160, 0) %SoftwareInterrupt(12, StackTaskFault, 160, 0) %SoftwareInterrupt(14, PageTaskFault, 160, 0) ; GP fault handler must be last %SoftwareInterrupt(13, GPTaskFault, 160, 0) ; Interrupt tasks entered WITHOUT an error code. %SoftwareInterrupt(1, TraceRawInt, 128, 0) ; Convergent debugger %SoftwareInterrupt(2, NmiTaskFault, 160, 0) ; Non-maskable interrupt(parity) %SoftwareInterrupt(3, BreakRawInt, 128, 0) ; Convergent debugger ; ; Describe the Hardware Interrupts topology for each ; machine on which this OS will run. ; ; Each topology begins with an entry for tyDevice=0 which must ; describe the primary interrupt controller chip, bit mask ; and memory word used to assert the initial mask. ; ; The macro format is: ; ; HardwareInterrupt(iLevel,tyDevice,lChip,bBit,wMem,Handler,sStack,fEnable) ; ; iLevel - the interrupt level ; tyDevice - the device type, used in calls to ControlInterrupt. ;  Literals are declared in SysGen_Common.mdf and CtosInternal.edf. ; 0 Interrupt controller ; 1 Cascaded controller ; 2 2nd cascaded controller or external controller ; 3 PIT (Programmable Interval Timer) ; 4 RTC (Real Time Clock) ; 5 LPT (Line Printer) ; 6 KBD (Keyboard) ; 7 RS422 line 1 (Cluster line 1) ; 8 RS422 line 2 (Cluster line 2) ; 9 Floppy1 (Internal/X-Bus shared, or Internal only) ; 10 WD-1010/2010 (Non-SCSI hard disk) ; 11 SCSI1 - SRP:Adapter 1, WS:Internal/X-Bus shared, or Internal only ; 12 SCSI2 - SRP:Adapter 2, WS:X-Bus when not shared ; 13 Dma TC (Terminal Count) ; 14 Doorbell ; 15 RS232 AB ; 16 RS232 CD ; 17 RS232 EF ; 18 RS232 GH ; 19 Math CoProcessor (PS2) ; 20 Redirected Cascade (PS2) ; 21 RS232 IJ ; 22 MegaBus DMA ; 23 Single Bit ECC error ; 24 X-Bus Interrupt 0 ; 25 X-Bus Interrupt 1 ; 26 Floppy2 (X-Bus when not shared) ; 27 X-Bus Interrupt 3 ; 28 X-Bus Interrupt 4 ; 29 HINTR87 (Reserved for OEM) ; 30 Keyboard Transmit ; 31 X-Bus Timeout (SuperGen only) ; lChip - string: 186, 8259, 8259Cascade, 8259Cascade2, DmaLPT or Ext8259 ; bBit - binary bit mask for the interrupt ; wMem - optional word variable to echo mask value ; Handler - name of public procedure which will handle the interrupt ; sStack - the count of bytes of the stack for the handler ; fEnable - a flag indicating whether or not interrupts are to be ; enabled when the handler is invoked. ; "CLI" (disabled) and "STI" (enabled) may also be used. ; ; If Handler is "NIL", no IDT entry will be defined for the device. ; This is used to define ControlInterrupt tables only. ; %IF (NOT %fGp) THEN ( ; T2/T3 %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 80h,mask8259A,NIL,0,0) %HardwareInterrupt( 64,tyXINTR0 ,8259, 01h,mask8259A,%' %' 'DmyISR,8000h+200h,CLI) %HardwareInterrupt( 65,tyRS232AB ,8259, 02h,mask8259A,%' %' 'RawCommNubAB,8000h+200h,CLI) %HardwareInterrupt( 66,tyXINTR1 ,8259, 04h,mask8259A,%' %' 'DmyISR,8000h+200h,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 67,tyWD2010 ,8259, 08h,mask8259A,%' %' 'DmyISR,512,STI) %HardwareInterrupt( 67,tySCSI2 ,8259, 08h,mask8259A,NIL,0,0) )FI %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster) OR (%wsType EQ ngenCluster)) THEN ( %HardwareInterrupt( 68,tyRS4221 ,8259, 10h,mask8259A,%' %' 'DmyISR,128,STI) )FI %HardwareInterrupt( 69,tyPIT ,8259, 20h,mask8259A,%' %' 'TimerInterrupt,8000h+200h,CLI) %HardwareInterrupt( 70,tyKBD ,8259, 40h,mask8259A,%' %' 'IntHKbd,512,STI) %HardwareInterrupt( 71,tyHINTR71 ,8259, 80h,mask8259A,%' %' 'DmyISR,128,STI); Special OEM %HardwareInterrupt( 80,tyRTC ,8259Cascade, 01h,cascade8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt( 81,tyXINTR3 ,8259Cascade, 02h,cascade8259A,%' %'  'DmyISR,128,STI) %HardwareInterrupt( 82,tyXINTR4 ,8259Cascade, 04h,cascade8259A,%' %' 'DmyISR,200h,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 83,tyFloppy1 ,8259Cascade, 08h,cascade8259A,%' %' 'DmyISR,320,STI) )FI %HardwareInterrupt( 84,tyLPT ,8259Cascade, 10h,cascade8259A,%' %' 'LpInterrupt,200h,STI) %HardwareInterrupt( 85,tyRS232CD ,8259Cascade, 20h,cascade8259A,%' %' 'RawCommNubCD,8000h+200h,CLI) ; FSA on B-28,B-38 EXP %HardwareInterrupt( 87,tyHINTR87 ,8259Cascade, 80h,cascade8259A,%' %' 'DmyISR,128,STI) ; Special OEM ; NewGen %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 80h,mask8259A,NIL,0,0) %HardwareInterrupt( 64,tyXINTR0 ,8259, 01h,mask8259A,%' %' 'DmyISR,8000h+200h,CLI) %HardwareInterrupt( 65,tyRS232AB ,8259, 02h,mask8259A,%' %' 'RawCommNubAB,8000h+200h,CLI) %HardwareInterrupt( 66,tyXINTR1 ,8259, 04h,mask8259A,%' %' 'DmyISR,8000h+200h,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 67,tyWD2010 ,8259, 008h,mask8259A,%' %' 'DmyISR,512,03h) %HardwareInterrupt( 67,tySCSI2 ,8259, 08h,mask8259A,NIL,0,0) )FI %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster) OR (%wsType EQ ngenCluster)) THEN ( %HardwareInterrupt( 68,tyRS4221 ,8259, 10h,mask8259A,%' %'  'DmyISR,128,STI) )FI %HardwareInterrupt( 69,tyPIT ,8259, 20h,mask8259A,%' %' 'TimerInterrupt,8000h+200h,CLI) %HardwareInterrupt( 70,tyKBD ,8259, 40h,mask8259A,%' %' 'IntHKbd,512,STI) %HardwareInterrupt( 71,tyHINTR71 ,8259, 80h,mask8259A,%' %' 'DmyISR,128,STI); Special OEM %HardwareInterrupt( 80,tyRTC ,8259Cascade, 01h,cascade8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt( 81,tyXINTR3 ,8259Cascade, 02h,cascade8259A,%' %' 'DmyISR,128,STI) %HardwareInterrupt( 82,tyXINTR4 ,8259Cascade, 04h,cascade8259A,%' %' 'DmyISR,200h,CLI) %HardwareInterrupt( 83,tyLPT ,8259Cascade, 08h,cascade8259A,%' %' 'LpInterrupt,200h,STI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 83,tyFloppy1 ,8259Cascade, 08h,cascade8259A,NIL,0,0) )FI %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 84,tySCSI1 ,8259Cascade, 10h,cascade8259A,%' %' 'DmyISR,512,STI) )FI %HardwareInterrupt( 87,tyHINTR87 ,8259Cascade, 80h,cascade8259A,%' %' 'DmyISR,128,STI) ; Special OEM ; SG-5000 %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 04h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyExternal ,Ext8259, 00h,third8259A,NIL,0,0) %HardwareInterrupt( 65,tyKBD ,8259, 02h,mask8259A,%' %' 'IntHKbd,512,STI) %HardwareInterrupt( 68,tyRS232CD ,8259, 10h,mask8259A,%' %' 'RawCommNubCD,8000h+200h,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 70,tyFloppy1 ,8259, 40h,mask8259A,%' %' 'DmyISR,320,STI) )FI %HardwareInterrupt( 71,tyLPT ,8259, 80h,mask8259A,%' %' 'LpInterrupt,200h,STI) %HardwareInterrupt( 81,tyRedirect ,8259Cascade, 02h,cascade8259A,NIL,0,0) %HardwareInterrupt( 83,tyVoice ,8259Cascade, 08h,cascade8259A,%' %'  'DmyISR,128,STI) %HardwareInterrupt( 84,tyKbdXmit ,8259Cascade, 10h,cascade8259A,%' %' 'IntHKbdXmit,512,STI) %HardwareInterrupt( 85,tyCoprocessor,8259Cascade, 20h,cascade8259A,%' %' 'Coprocessor2Error,128,STI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 86,tyWD2010 ,8259Cascade, 40h,cascade8259A,%' %' 'DmyISR,512,STI) %HardwareInterrupt( 86,tySCSI1 ,8259Cascade, 40h,cascade8259A,NIL,0,0) %HardwareInterrupt( 86,tySCSI2 ,8259Cascade, 40h,cascade8259A,NIL,0,0) )FI %HardwareInterrupt( 87,tyXBusTimeout,8259Cascade, 80h,cascade8259A,%' %' 'XBusTimeout,320,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 87,tyFloppy2 ,8259Cascade, 80h,cascade8259A,NIL,0,0) )FI %HardwareInterrupt( 96,tyRS232AB ,Ext8259, 01h,third8259A,%' %' 'RawCommNubAB,8000h+200h,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster) OR (%wsType EQ ng enCluster)) THEN ( %HardwareInterrupt( 97,tyRS4221 ,Ext8259, 02h,third8259A,%' %' 'DmyISR,128,STI) )FI %HardwareInterrupt( 98,tyXINTR0 ,Ext8259, 04h,third8259A,%' %' 'DmyISR,8000h+200h,CLI) %HardwareInterrupt( 99,tyXINTR1 ,Ext8259, 08h,third8259A,%' %' 'DmyISR,8000h+200h,CLI) %HardwareInterrupt(100,tyXINTR4 ,Ext8259, 10h,third8259A,%' %' 'DmyISR,200h,CLI) %HardwareInterrupt(101,tyPIT ,Ext8259, 20h,third8259A,%' %'  'TimerInterrupt,8000h+200h,CLI) %HardwareInterrupt(102,tyRTC ,Ext8259, 40h,Third8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt(103,tyXINTR3 ,Ext8259, 80h,third8259A,%' %' 'DmyISR,128,STI) ; B-38 LCW %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 04h,mask8259A,NIL,0,0) %HardwareInterrupt( 65,tyRS232AB ,8259, 02h,mask8259A,%' %' 'RawCommNubAB,8000h+200h,CLI) %HardwareInterrupt( 80,tyRTC ,8259Cascade, 01h,cascade8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt( 81,tyRS232CD ,8259Cascade, 02h,cascade8259A,%' %' 'RawCommNubB,8000h+200h,CLI) %HardwareInterrupt( 82,tyRS4221 ,8259Cascade, 04h,cascade8259A,%' %' 'DmyISR,128,STI) %HardwareInterrupt( 83,tyKBD ,8259Cascade, 08h,cascade8259A,%' %' 'IntHKbd,512,STI) %HardwareInterrupt( 84,tyPIT ,8259Cascade, 10h,cascade8259A,%' %'  'TimerInterrupt,8000h+200h,CLI) %HardwareInterrupt( 85,tyCoprocessor,8259Cascade, 20h,cascade8259A,%' %' 'RawCommNubCD,8000h+200h,CLI) %HardwareInterrupt( 86,tyLPT ,8259Cascade, 40h,cascade8259A,%' %' 'LpInterrupt,200h,STI) %HardwareInterrupt( 87,tyXINTR3 ,8259Cascade, 80h,cascade8259A,%' %' 'DmyISR,128,STI) ; PC/AT %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 04h,mask8259A,NIL,0,0) %HardwareInterrupt( 64,tyPIT ,8259, 01h,mask8259A,%' %' 'TimerInterrupt,8000h+200h,CLI) %HardwareInterrupt( 65,tyKBD ,8259, 02h,mask8259A,%' %' 'IntHKbd,512,STI) %HardwareInterrupt( 67,tyRS232CD ,8259, 08h,mask8259A,%' %' 'RawCommNubB,8000h+200h,CLI) %HardwareInterrupt( 68,tyRS232AB ,8259, 10h,mask8259A,%' %' 'RawCommNubAB,8000h+200h,CLI) %HardwareInterrupt( 69,tyIRQ5 ,8259, 20h,mask8259A,%' %'  'DmyISR,512,CLI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 70,tyFloppy1 ,8259, 40h,mask8259A,%' %' 'DmyISR,320,STI) )FI %HardwareInterrupt( 71,tyLPT ,8259, 80h,mask8259A,%' %' 'LpInterrupt,200h,STI) %HardwareInterrupt( 80,tyRTC ,8259Cascade, 01h,cascade8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt( 81,tyRedirect ,8259Cascade, 02h,cascade8259A,NIL,0,0) %HardwareInterrupt( 81,tyRS4221 ,8259Cascade, 02h,cascade8259A,%' %' 'DmyISR,128,STI) %HardwareInterrupt( 82,tyIRQ10 ,8259Cascade, 04h,cascade8259A,%' %' 'DmyISR,512,CLI) %HardwareInterrupt( 83,tyIRQ11 ,8259Cascade, 08h,cascade8259A,%' %' 'DmyISR,512,CLI) %HardwareInterrupt( 84,tyKbdXmit ,8259Cascade, 10h,cascade8259A,%' %' 'IntHKbd,512,STI) %HardwareInterrupt( 85,tyCoprocessor,8259Cascade, 20h,cascade8259A,%' %' 'Coprocessor2Error,128,STI) %IF ((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN ( %HardwareInterrupt( 86,tyWD2010 ,8259Cascade, 40h,cascade8259A,%' %' 'DmyISR,512,03h) %HardwareInterrupt( 86,tySCSI1 ,8259Cascade, 40h,cascade8259A,NIL,0,0) %HardwareInterrupt( 86,tySCSI2 ,8259Cascade, 40h,cascade8259A,NIL,0,0) )FI ;*AA* %HardwareInterrupt( 86,tyRS232EF ,8259Cascade, 40h,cascade8259A,%' %' 'NIL,8000h+200h,CLI) %HardwareInterrupt( 87,tyDoorbell ,8259Cascade, 80h,cascade8259A,%' %'  'BmicInterrupt,512,STI) ; Comarch %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 04h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade2 ,8259Cascade, 04h,cascade8259A,NIL,0,0) ;*AA* %HardwareInterrupt( 65,tyRS232AB ,8259Cascade, 08h,cascade8259A,%' %' 'RawCommNubAB,8000h+256,CLI) %HardwareInterrupt( 67,tyRS4221 ,8259Cascade, 08h,cascade8259A,%' %' 'DmyISR,256,CLI) %HardwareInterrupt( 67,tyIRQ11 ,8259Cascade, 08h,cascade8259A,%' %' 'NIL,0,0) %HardwareInterrupt( 68,tyRS4222 ,8259Cascade2, 80h,third8259A,%' %' 'DmyISR,128,CLI) %HardwareInterrupt( 69,tyPIT ,8259, 08h,mask8259A,%' %' 'TimerInterrupt,8000h+256,CLI) %HardwareInterrupt( 80,tyRTC ,8259Cascade, 01h,cascade8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt( 81,tyDoorbell ,8259Cascade2, 01h,third8259A,%' %' 'BmicInterrupt,512,STI) ;*AA* %HardwareInterrupt( 84,tyRS232CD ,8259Cascade, 08h,cascade8259A,%' %' 'RawCommNubISDNAD,8000h+320,CLI) %HardwareInterrupt( 85,tyRS232EF ,8259Cascade, 20h,cascade8259A,%' %' 'RawCommNubISDNB1,8000h+320,CLI) %HardwareInterrupt( 86,tyRS232GH ,8259Cascade, 40h,cascade8259A,%' %' 'RawCommNubISDNB2,8000h+256,CLI) %HardwareInterrupt( 87,tyDmaTC ,8259, 10h,mask8259A,%' %' 'SoftwareDmaInterrupt,256,STI) )ELSE( ; GP %HardwareInterrupt( 0,tyController ,8259, 00h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade ,8259, 04h,mask8259A,NIL,0,0) %HardwareInterrupt( 0,tyCascade2 ,8259Cascade, 04h,cascade8259A,NIL,0,0) %HardwareInterrupt( 65,tyRS232AB ,8259Cascade2, 04h,third8259A,%' %' 'RawCommNubAB,8000h+256,CLI) %HardwareInterrupt( 67,tyRS4221 ,8259Cascade2, 40h,third8259A,%' %' 'DmyISR,128,CLI) %HardwareInterrupt( 68,tyRS4222 ,8259Cascade2, 80h,third8259A,%' %' 'DmyISR,128,CLI) %HardwareInterrupt( 69,tyPIT ,8259, 08h,mask8259A,%' %' 'TimerInterrupt,8000h+256,CLI) %HardwareInterrupt( 71,tyEccError ,8259Cascade2, 02h,third8259A,%' %' 'SingleBitErrorInterrupt,128,STI) %HardwareInterrupt( 80,tyRTC ,8259Cascade, 01h,cascade8259A,%' %' 'RTCInterrupt,128,STI) %HardwareInterrupt( 81,tyDoorbell ,8259Cascade, 08h,cascade8259A,%' %' 'Chime,256,STI) %HardwareInterrupt( 82,tyMegabusDma ,8259Cascade, 40h,cascade8259A,%' %' 'MegaBusDmaInterrupt,256,STI) %HardwareInterrupt( 83,tyLPT ,8259Cascade2, 01h,third8259A,%' %' 'LpInterrupt,128,STI) %HardwareInterrupt( 84,tyRS232CD ,8259Cascade2, 10h,third8259A,%' %' 'RawCommNubCD,8000h+320,CLI) %HardwareInterrupt( 84,tySCSI1 ,8259Cascade2, 10h,third8259A,NIL,0,0) %HardwareInterrupt( 85,tyRS232EF ,8259Cascade2, 20h,third8259A,%' %' 'RawCommNubEF,8000h+320,CLI) %HardwareInterrupt( 85,tySCSI2 ,8259Cascade2, 20h,third8259A,NIL,0,0) %HardwareInterrupt( 86,tyRS232GH ,8259Cascade2, 08h,third8259A,%' %' 'RawCommNubGH,8000h+256,CLI) %HardwareInterrupt( 87,tyDmaTC ,8259, 10h,mask8259A,%' %' 'SoftwareDmaInterrupt,256,STI) )FI%' GP %EndHardwareInterruptTables )FI%' CtosP EVEN ;################################################################ ; The following list of request codes are those requests for which the ; cluster agent will NOT mark the user as using resources on the master ; and therefore require no termination on the master. Clusters ; which issue to the master only the requests which are in this list will ; not have termination requests sent to the master. ; %RequestNoRemoteTermination(14) ;GetDateTime %RequestNoRemoteTermination(235) ;CheckForMail %RequestNoRemoteTermination(101Ah) ;RemoteTermination %EndRemoteTermination ;################################################################ ;################################################################ ; Software Bus File Specs. ; The OS executes the files below at boot time in the order listed. ; The macros to define the run files are: ; ; InitRunFilePassword(Password) ; InitRunFile(RunFileSpec, attr) ; where attr is: ; Video - run file configurable via :VdmFile: ; Rkvs - run file configurable via :RkvsFile: ; Dump - run file exeuted for ext crashdumping ; NoReset - action finish disabled before this point ; Cluster - srvr disabled before this point ; ; The first 3 run files must be Video, Rkvs, and ExtCrashDump. ;################################################################ %InitRunFilePassword("") %IF (%ctosv) THEN ( %InitRunFile("[Sys]PS_V.sys", "") )FI %InitRunFile("[Sys]InstallVdm.Run", "Video") %InitRunFile("", "NoReset") ; action-finish disabled until this point. %InitRunFile("[Sys]Rkvs.Run", "Rkvs") %InitRunFile("[Sys]ExtCrashDump.Run", "Dump") %InitRunFile("", "Cluster") ; Cluster disabled until this point in the sequence. %InitRunFile("[Sy s]InstallKbd.Run", "") %InitRunFile("[Sys]Oem1.Run", "") %InitRunFile("[Sys]Oem2.Run", "") %InitRunFile("[Sys]Oem3.Run", "") %InitRunFile("[Sys]Oem4.Run", "") %InitRunFile("[Sys]DisplayConfig.Run", "") %InitRunFile("[Sys]SysInit.Run", "") %InitRunFile("[Sys]Signon.Run", "") %InitRunFileEnd %IF (%CtosP) THEN ( ;################################################################ ; Native Langauge Support Keyboard Table(s) File ; This macro defines the name of the file to be loaded at ; initialization which contains keyboard emulation and encoding tables. ; It will also be accessed at runtime if the keyboard id changes. ;################################################################ %IF(%*isdef(%NlsKbdFile)) THEN ( %NlsKbdFileSpec("%NlsKbdFile","") ) ELSE ( %NlsKbdFileSpec("[Sys]NlsKbd.Sys","") )FI %IF(%*isdef(%WsNlsKbdFile)) THEN ( %WsNlsKbdFileSpec("%WsNlsKbdFile") ) ELSE ( %WsNlsKbdFileSpec("[Sys]Ws###>NlsKbd.Sys") )FI )FI EVEN ;############################################################### ; ; Space occupied by the tables below this location will be ; reclaimed by the CTOS after its initialization ; ; ANY RE-ORDERING OF THIS FILE MUST NOT CROSS THIS BOUNDRY !!! ; ; CTOS has been carefully constructed so that the various parts ; of CTOS reside either before this boundry (resident code and ; data) or after (initialization code and data). There are ; five segments which are used in controlling this: ; ; "code" ... anything in this segment will be resident ; "const" .. anything in this segment will be resident ; "data" ... anything in this segment will be resident if ; the module is linked before SysGen.Obj, or ; non resident if linked after ; "stack" .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization) ; ; The CTOS processes are allocated stacks out of memory ; reserved by the following macro call, and the stack segment ; is used only for a stack during CTOS initialization. ; ; The following macro is invoked with one argument, the number ; of bytes to be reserved for CTOS to use to build its ; structures, tables, and to allocate the stacks for the ; different processes (declared later in this file). The macro ; variable sOsData may be defined in the prefix file if ; desired. The OS will crash with as error 101 if this value ; is too small. ;################################################################ %IF (%*IsDef(%sOsData)) THEN ( %ResidentDataBoundry(%sOsData) ) ELSE ( %IF (%wsType EQ ngenCluster) THEN (%ResidentDataBoundry(15240))FI %IF (%wsType EQ ngen) THEN (%ResidentDataBoundry(20480))FI %IF (%wsType EQ NGenMaster) THEN (%ResidentDataBoundry(26600))FI %IF (%fSrp) THEN (%ResidentDataBoundry(25600))FI )FI EVEN ;############################################################### ; ; Table which describes reserved exchanges ; for CTOS resident processes. List each exchange only once. ; ;############################################################### %AssignSysExch(1,Kbd) ;kbd %AssignSysExch(3,SysIn) ;sysin or LogProc_Mf %AssignSysExch(5,Termination) ;termination %IF (%fVarPar) THEN (%' %AssignSysExch(6,Sched) ; Variable Partition process )FI %AssignSysExch(10,LclFileSys) ;lclFileSys %AssignSysExch(11,FileSys) ;CTOS "File system" %AssignSysExch(12,Agent) ;agent %AssignSysExch(15,Init) ;init process %AssignSysExch(24,KbdInternal) ;kbd internal %IF (%fNoFileSystem EQ 0) THEN (%' %AssignSysExch(8,MassIo) ;massIo %AssignSysExch(9,FsPocket) ;exchFsPocket %AssignSysExch(14,ScsiManager) ;SCSI Manager (NGen and GP) %AssignSysExch(16,FsPeriodic) )FI %IF (%fSrp) THEN ( %AssignSysExch(4,FilterPros) ;srp filter process )FI %'IF(%clusterConfig EQ 2)THEN(%' %AssignSysExch(17,MstrAgentRcv) ;master agent receiver, also Mf %AssignSysExch(13,MstrAgent) ;master agent %')FI %AssignSysExch(26,Swapper) ;swapper internal %AssignSysExch(2,VideoSem) ;video semaphore internal and Kbd_Mf %AssignSysExch(27,HwId) ;Hardware Id ;AssignSysExch(28,Nvram) ;Nvram Manager %IF (%fCP OR %fTp) THEN (%' %AssignSysExch(20,TpReq) ;ExchTpReq %AssignSysExch(21,TpResp) ;ExchTpResp )FI %' The following must be done last, so they choose an exch nobody else wants. %IF (%fSrp) THEN (%' %AllocSysExch(exchFilterPocket) ;File spec routing process pocket )FI %IF (%fVarPar) THEN (%' %AllocSysExch(exchSchedPocket) ;any free exch %AllocSysExch(exchQuiet) )FI %AllocSysExch(exchRqTracker) %AllocSysExch(exchSpecHeap) %AllocSysExch(ExchOSNamePlace) %AllocSysExch(exchPit) EVEN ;############################################################### ; ; Table which describes the CTOS resident processes. Each ; process is described by 5 attributes: ; ; 1. Process entry point ; 2. Size of its stack ; 3. priority (0 is highest, 254 lowest) ; 4. default exchange (0 if not required, <> 0 allocs next available) ; 5. optional "check proc" name; if supplied (non-0), proc is called ; to decide if the process should be created ; ; Stack size -- ; The stack size for a CTOS process must be large enough ; for the largest local variable and procedure call sequence, ; plus enough space for all possible interrupts that can occur. ; CTOS requires 64 bytes of user stack to save the context of a ; process when an interrupt occurs. ; ; Priorities -- ; In order for CTOS to function correctly, the following ; priority considerations must be obeyed: ; ; MassIo ................ same as SCSI Manager ; SCSI Manager .......... same as MassIo ; Sched ................. higher than TerminationProcess ; TerminationProcess .... lower than Sched ; ; All user (non CTOS) processes must be worse in priority than ; CTOS processes (The Convergent Executive starts all user ; programs with priority 128). ; ; process priorities: ; 0 Clock ; 1 Timer ; 2 Keyboard/Debugger ; 3 Master Agent Receiver/Cluster Agent ; 4 MasterAgent ; 5 QuietProcess/TpProcess ; 6 RealFileSys/RKVS/Video ; 7 Sched/FilterPros ; 8 Termination ; 9 OvlyMgr(ResourceMgr)/ServiceHwIdRq ; 10 SysInPro ; 10 Massio ; 10 ScsiManager ;############################################################### %IF(%CTOSV) THEN (%SET(sSchedStack,1024)) ELSE (%SET(sSchedStack,500))FI %IF (%fSrp) THEN ( %' SRP %OsProcDesc(KbdProcess, 512, 2, %TRUE, 0) %IF (%ctosp) THEN ( %OsProcDesc(ClockPro, 256, 0, %TRUE, 0) )FI %OsProcDesc(Timer, 256, 1, %FALSE, 0) %IF (%fCP OR %fGP) THEN ( %' Cluster Server %'OsProcDesc(MstrAgentReceiver, 256, 3, %TRUE, 0) %'OsProcDesc(MstrAgent, 256, 4, %TRUE, 0) ) FI %IF (%fTP OR %fCP) THEN ( %' Comm Server %OsProcDesc(TpProcess, 512, 5, %TRUE, 0) ) FI %IF(%fVarPar) THEN ( %OsProcDesc(QuietProcess, 512, 5, %TRUE, 0) %OsProcDesc(Sched, %sSchedStack, 7, %TRUE, 0) ) FI %OsProcDesc(TerminationProcess, 400, 8, %TRUE, 0) %OsProcDesc(LclFsFilterProcess, 170, 7, %TRUE, 0) %OsProcDesc(FileSystem/ResourceMgr, 600, 5, %TRUE, 0) %OsProcDesc(SysInPro, 256, 10, %TRUE, 0) %OsProcDesc(ServiceHwIdRq, 512, 9, 1, CheckHostCPU) %OsProcName(Null) ) ELSE ( %' Workstations %IF(%wsType EQ ngenCluster) THEN ( %' Clstr %OsProcDesc(KbdProcess, 768, 2, %TRUE, 0) %OsProcDesc(Timer, 256, 1, %FALSE, 0) %OsProcDesc(FileSystem/ResourceMgr, 600, 5, %TRUE, 0) %OsProcDesc(SysInPro, 256, 10, %TRUE, 0) %OsProcDesc(TerminationProcess, 400, 8, %TRUE, 0) %OsProcDesc(ServiceHwIdRq, 512, 9, %TRUE, 0) %IF(%fVarPar) THEN ( %OsProcDesc(QuietProcess, 512, 5, %TRUE, 0) %OsProcDesc(Sched, %sSchedStack, 7, %TRUE, 0) ) FI %OsProcName(Null) ) FI %IF(%wsType EQ ngen) THEN ( %IF(%localFS EQ 0) THEN ( %' Stnd %OsProcDesc(KbdProcess, 768, 2, %TRUE, 0) %OsProcDesc(Timer, 256, 1, %FALSE, 0) %OsProcDesc(FileSystem/ResourceMgr, 600, 5, %TRUE, 0) %OsProcDesc(SysInPro, 256, 10, %TRUE, 0) %OsProcDesc(TerminationProcess, 400, 8, %TRUE, 0) %OsProcDesc(ServiceHwIdRq, 512, 9, 1, 0) %IF (%fVarPar) THEN ( %OsProcDesc(QuietProcess, 512, 5, %TRUE, 0) %OsProcDesc(Sched, %sSchedStack, 7, %TRUE, 0) ) FI ) ELSE ( %' ClstrLfs %OsProcDesc(KbdProcess, 768, 2, %TRUE, 0) %OsProcDesc(Timer, 256, 1, %FALSE, 0) %OsProcDesc(FileSystem/ResourceMgr, 600, 5, %TRUE, 0) %OsProcDesc(SysInPro, 256, 10, %TRUE, 0) %OsProcDesc(TerminationProcess, 400, 8, %TRUE, 0) %OsProcDesc(ServiceHwIdRq, 512, 9, 1, 0) %IF (%fVarPar) THEN ( %OsProcDesc(QuietProcess, 512, 5, %TRUE, 0) %OsProcDesc(Sched, %sSchedStack, 7, %TRUE, 0) ) FI  )FI %OsProcName(Null) )FI %IF(%wsType EQ NGenMaster) THEN ( %' Mstr %OsProcDesc(KbdProcess, 768, 2, %TRUE, 0) %OsProcDesc(Timer, 256, 1, %FALSE, 0) %OsProcDesc(FileSystem/ResourceMgr, 600, 5, %TRUE, 0) %OsProcDesc(SysInPro, 256, 10, %TRUE, 0) %OsProcDesc(TerminationProcess, 400, 8, %TRUE, 0) %OsProcDesc(ServiceHwIdRq, 512, 9, 1, 0) %IF (%fVarPar) THEN ( %OsProcDesc(QuietProcess, 512, 5, %TRUE, 0) %OsProcDesc(Sched, %sSchedStack, 7, %TRUE, 0) )FI %O sProcName(Null) ) FI ) FI %' Workstation EVEN ;############################################################### ; CTOS INITIALIZATION -- ; The following macros generate three tables of pointers which ; are used by CTOS during its initialization phase. All of the ; routines pointed to in these tables reside in modules which ; are linked near the end of CTOS, and the code for these ; modules is discarded after initialization is complete. These ; routines should have their code segments named "coed", and ; should use "data" for the name of their data segments. This ; is to insure that the Linker will place the code and data at ; the end of the run file, after the "ResidentDataBoundry" ; mentioned earlier in this file. The routines should obey the ; Convergent programming conventions related to register usage ; (refer to The Assembly Language Manual). The routines are ; executed at one of three times during CTOS initialization: ; ; InitProcHardware ; After CTOS is booted, and after memory and bus timeout ; tests are completed. This is the place to put hardware ; test and verification routines. ; ; InitProcIntDisable ; After CTOS structures have been initialized but before ; any processes have been started. This is the place to ; put hardware intitialization routines. ; ; InitProcIntEnable ; After interrupts are enabled these routines are executed ; as if they were a user program. (CTOS processes are running). ; This is the place to put user process initialization routines. ; ; The routines are called in the order given, with no arguments, as ; subroutines using the Assembly Language indirect far call instruction. ; ; DESCRIPTION OF CONVERGENT INITIALIZATION ROUTINES -- ; ; FileSystem: ; InitFsDataStructures ; InitFsHardware ; InitFsMountDevices ; InitFsSysDevNum ; InitFsSystemTime ; ; SRP: ; InitVideo .......... Video and screen initialization ; ClockTest .......... (186 only) ; IccInit ............ Determine bus configuration ; RqExInit ........... ; InitSysCom ......... System common area initialization ; InitRtc ............ RTC initialization ; InitPIT ............ PIT initialization ; StartRTC ........... ; AddressBootBlock ... ; RestoreRTC ......... ; InitMapHardware .... Initialization for DMA mapping (386 only) ; InitOSNamePlace .... proc/exchange name table ; InitDebugNub ....... Debugger initialization routine ; LoadFsMaster ....... Load filesystem if masterFp ; LoadSrpConfig_Sys .. Setup configuration file for parsing ; ParseIccData ....... Read ICC configuration ; InitIccSegment ..... Initialize ICC structures ; InitRouteTables .... Initialize routing tables ; InitBroadcastHeap .. ; LoadFsNotMaster .... Load filesystem if not masterFp ; DoExtDump .......... Extended crash dumping ; ParseSrpConfig_Sys . Read configuration information ; LoadFileInit ....... Load request files ; InitNLSTables ...... Initialize native language support ; InitStatusLog ...... Log previous status and crash information ; ParseBootList ...... Boot boards as per configuration file ; InitSpecHeap ....... Initialize spec expansion heap ; TpInit ............. Initialize terminal processor ; CpInit ............. Initialize cluster processor ; WaitForSrpCpuSync .. Synchronize boards on system bus ; InitRouteTables .... Update routing tables from masterFp ; SetDateTimeMaster .. Set system date and time ; InitMstr ........... Initialize cluster ; InitVpSwapFile ..... ; InitVpStructures ... ; InitStatusVideo .... Display previous status and crash information ; LoadTableOfContents Load BootTape Table of Contents ; CleanupTableOfContents Any necessary cleanup (i.e., memory, drivers) ; LoadMemDiskImage ... Load MemDisk from BootTape ; ; Workstation: ; SysGenInit .... Set variables according to rgSysGen structure ; InitVideo ..... make sure video hardware works ; KbdTest ....... see if kbd hardware works ; RqExInit ...... Map virtual exchanges ; FsIn1 ......... File system initialization ; Init8255 ...... LED port ; InitRtc ....... RTC initialization ; InitSysCom .... System common area initialization ; Init8237 ...... DMA Initialization ; Init8251 ...... 8251A Initialization ; KbdInit ....... Keyboard initialization ; InitCounter ... 8253 counter 0 initialization ; Init8259 ...... 8259A Initialization ; CheckDisks .... Look for hard disk ; FsIn2 ......... File system initialization routine ; InitLoadFS .... Load file system and synchronize ; DumpAndMTest .. Dump & memory test above 128K ; InitOSNamePlace .... proc/exchange name table ; InitDebugNub .. Debugger initialization routine ; InitReadEisaCmos ... Reads resource information from EISA CMOS ; LoadFileInit .. Loads boot-time configuration file(s) ; WsInit ........ Cluster WS Agent Initialization ; InitMstr ...... Master WS Cluster Initialization ; IopInit ....... Master WS Cluster Initialization ; IopStart ...... Master WS Cluster Initialization ; SysDeviceInit . Initialize system devices ; InitEisaConfig .... Allocates PC resources ; ;################################################################ %IF(%fSrp) THEN ( %' Pc + Comarch %' Everything including the kitchen sink! %InitProcHardware(InitResetBmic) %InitProcHardware(Init8259) %InitProcHardware(Init82380) %InitProcHardware(InitVideo) %InitProcHardWare(KbdTest) %InitProcHardWare(ClockTest) %InitProcHardware(Init8259) %' Reinitialize after clock test %InitProcHardware(CheckForDAIModule) %InitProcHardware(Init8237) %InitProcHardware(Init8251) %InitProcHardware(InitComm2) %InitProcHardware(IccInit) %InitProcIntDisable(RqExInit) %InitProcIntDisable(KbdInit) %InitProcIntDisable(Init8259) %InitProcIntDisable(InitUcbs) %InitProcIntDisable(InitSysCom) %InitProcIntDisable(AllocMemForxLat) %InitProcIntDisable(InitMapHardware) %InitProcIntDisable(InitRtc) %InitProcIntDisable(InitPIT) %InitProcIntDisable(StartRTC) %InitProcIntDisable(AddressBootBlock) %InitProcIntDisable(RestoreRTC)%' Last IntDisable proc %IF(%fBT) THEN ( %InitProcIntDisable(LoadTableOfContents) %InitProcIntDisable(InitLoadBootTapeOs) )FI %InitProcIntEnable(InitDwellCalibrate) %InitProcIntEnable(InitAllocUsers) %InitProcIntEnable(InitOSNamePlace) %' OSName Place %IF(%fDebugger) THEN ( %InitProcIntEnable(InitDbgOsIntf) %' Helps debug init crash dumps %IF(%fWrappedDebugger) THEN ( %InitProcIntEnable(InitVpStructures) %InitProcIntEnable(InitNlsTables) %InitProcIntEnable(InitDebugNub) )FI )FI %IF(NOT(%fNoFileSystem)) THEN (%' %' LoadFsMaster must be before LoadSrpConfig_Sys. %InitProcIntEnable(LoadFsMaster) %'InitProcIntEnable(LoadTableOfContents) %'InitProcIntEnable(LoadMemDiskImage) )FI %InitProcIntEnable(LoadConfig_Sys) %InitProcIntEnable(ParseIccData) %' InitIccSegment must be after ParseIccData. %InitProcIntEnable(InitIccSegment) %InitProcIntEnable(InitRcbSegment) %InitProcIntEnable(InitEnableBmic) %InitProcIntEnable(InitIccToMaster) %' Until InitRouteTables non-MasterFp only allowed to request to MasterFp, %' and MasterFp not allowed to issue any off-board requests. %IF(NOT(%fNoFileSystem)) THEN (%' %' LoadFsNotMaster must be after InitIccSegment. %InitProcIntEnable(LoadFsNotMaster) )FI %IF(%ctosv) THEN ( %InitProcIntEnable(InitReadEisaCmos) )FI %' InitConfig must be after InitIccSegment. %InitProcIntEnable(InitConfig) %InitProcIntEnable(InitBroadcastHeap) %' InitDebugNub must be after Initconfig. %IF (NOT %fWrappedDebugger) THEN ( %InitProcIntEnable(InitNlsTables) %InitProcIntEnable(InitDebugNub) )FI %InitProcIntEnable(LoadFileInit) %' InitStatusLog must be before ParseBootList. %InitProcIntEnable(InitStatusLog) %IF(%fVarPar) THEN ( %InitProcIntEnable(InitVpSwapFile) %IF (NOT %fWrappedDebugger) THEN ( %InitProcIntEnable(InitVpStructures) )FI )FI %InitProcIntEnable(ParseBootList) %' DoExtDump must be after ParseBootList. %InitProcIntEnable(DoExtDump) %InitProcIntEnable(InitSpecHeap) %IF(NOT(%fNoFileSystem)) THEN (%' %'InitProcIntEnable(CleanupTableOfContents) )FI %InitProcIntEnable(WaitForSrpCpuSync) %InitProcIntEnable(InitRouteTables) %InitProcIntEnable(SetDateTimeMaster) %InitProcIntEnable(CheckScrVol) %InitProcIntEnable(EnableMountTable) %InitProcIntEnable(LoadAgent) %InitProcIntEnable(StartRTC) %' In case crystal changed. %IF(%ctosv) THEN ( %InitProcIntEnable(InitEisaConfig) %InitProcIntEnable(InitSem) %InitProcIntEnable(InitNameHeap) %InitProcIntEnable(InitDynLink) )FI %IF(%ctosv) THEN ( %InitProcIntEnable(InitKernelStacks) )FI ) ELSE ( %' Workstation %InitProcHardware(Init8259) %InitProcHardWare(InitVideo) %InitProcHardWare(KbdTest) %InitProcHardWare(ClockTest) %InitProcHardware(Init8259) %' Reinitialize after clock test %InitProcIntDisable(CheckForDAIModule) %InitProcIntDisable(StartRtc) %InitProcIntDisable(Init8237) %InitProcIntDisable(Init8251) %InitProcIntDisable(InitComm2) %InitProcIntDisable(RqExInit) %InitProcIntDisable(KbdInit) %InitProcIntDisable(Init8259) %'SuperGen Debug ... StartRtc after Init8259 %InitProcIntDisable(StartRtc) %InitProcIntDisable(InitUcbs) %InitProcIntDisable(InitSysCom) %InitProcIntDisable(AllocMemForxLat) %InitProcIntDisable(InitRtc) %IF((%wsTy  pe EQ ngenCluster) OR (%wsType EQ ngen) ) THEN(%' Clstr, ClstrLfs %InitProcIntDisable(DAIFromHardware) )FI %InitProcIntDisable(RestoreRTC)%' Last IntDisable proc %InitProcIntEnable(InitDwellCalibrate) %InitProcIntEnable(InitAllocUsers) %InitProcIntEnable(InitOSNamePlace) %' OSName Place %IF(%fDebugger) THEN ( %InitProcIntEnable(InitDbgOsIntf) %' Helps debug init crash dumps )FI %IF (%fWrappedDebugger) THEN ( %InitProcIntEnable(InitVpStructures) %InitProcIntEnable(InitNlsTables) %InitProcIntEnable(InitDebugNub) )FI %IF(%ctosv) THEN ( %InitProcIntEnable(InitReadEisaCmos) )FI %InitProcIntEnable(AddressBootBlock) %IF((%wsType EQ ngen) AND (%localFS EQ 1) ) THEN (%' ClstrLfs %InitProcIntEnable(InitLoadClstrLfs) ) ELSE (%' NOT ClstrLfs %IF((%wsType EQ ngen) OR (%wsType EQ ngenMaster)) THEN(%' Stnd, Master %InitProcIntEnable(InitLoadFS) )FI %IF(%wsType EQ ngenCluster) THEN(%' Clstr %InitProcIntEnable(LoadAgent) )FI %InitProcIntEnable(SysDeviceInit)  %InitProcIntEnable(InitConfig) )FI %InitProcIntEnable(InitSpecHeap) %IF (NOT %fWrappedDebugger) THEN ( %InitProcIntEnable(InitDebugNub) )FI %InitProcIntEnable(LoadFileInit) %IF (NOT %fWrappedDebugger) THEN ( %InitProcIntEnable(InitNlsTables) )FI %IF(%ctosv) THEN ( %InitProcIntEnable(InitEisaConfig) %InitProcIntEnable(InitSem) %InitProcIntEnable(InitNameHeap) %InitProcIntEnable(InitDynLink) )FI %' LoadAgent as late as possible to avoid mode-3 fence fragmentation. %IF (%wsType EQ NGenMaster) THEN ( %' Master %InitProcIntEnable(LoadAgent) )FI %IF((%wsType EQ ngen) AND (%localFS EQ 0) ) THEN( %' Stnd %InitProcIntEnable(LoadAgent) )FI %IF (%fVarPar) THEN ( %InitProcIntEnable(InitVpSwapFile) %IF (NOT %fWrappedDebugger) THEN ( %InitProcIntEnable(InitVpStructures) )FI )FI %IF(%ctosv) THEN ( %InitProcIntEnable(InitKernelStacks) )FI %InitProcIntEnable(InitStatusLog) )FI %' Workstations %InitProcIntEnable(InitStatusVideo) %' CTOS ;################################################################ ; Native Langauge Support Table File ; This macro defines the name of the file to be loaded at ; initialization which contains national tables and strings. ;################################################################ %IF(%*isdef(%NlsFile)) THEN ( %NlsFileSpec("%NlsFile","") ) ELSE ( %NlsFileSpec("[Sys]Nls.Sys","") )FI %IF(%*isdef(%WsNlsFile)) THEN ( %WsNlsFileSpec("%WsNlsFile") ) ELSE ( %WsNlsFileSpec("[Sys]Ws###>Nls.Sys") )FI %IF (%fSrp) THEN ( ;################################################################ ; Default Configuration File # ; This macro defines the default SrpConfig.sys file which is # ; used to bring the system up if there is no configuration # ; file in [sys] or it is unusable. # ;################################################################ %IF (%*IsDef(%DefaultConfigFile)) THEN ( %DefaultCnfgFile("%DefaultConfigFile") ) ELSE ( %DefaultCnfgFile("%' %' ':Boot:(Processor=CP00,OS=[sys]rSrpCp.run) %' ':Boot:(Processor=GP00,OS=[sys]pSrpGp.img) ") )FI )FI ;################################################################ ; Default Debugger Ports # ; This macro defines the default Debugger port. For # ; processors without ports, the CP terminal ports are used. # ;  # ;################################################################ %IF(%fGP) THEN ( %DefaultDebugPort(None,B) )FI %IF(%fFP) THEN ( %DefaultDebugPort(CP00,B) )FI %IF(%fDP OR %fSP) THEN ( %DefaultDebugPort(CP00,B) )FI %IF(%fCP) THEN ( %DefaultDebugPort(None,C) )FI %IF(%fTP) THEN ( %DefaultDebugPort(None,J) )FI ;############################################################### ; Configuration File -- ; These macros define the search path for the configuration file. ; ; The procedure for finding the config file is as follows: ; ; 1. If the system has a CMOS or NVRAM Hardware ID use ; '[sys]HWnnn>config.sys' if present. ; 2. If the system was booted from the cluster use ; '[sys]WSnnn>config.sys' if present. ; 3. If the system was booted from the cluster use ; '[sys]WS>config.sys' if present. ; 4. Use '[sys]config.sys' if present. ;################################################################ %IF(%*isdef(%ConfigFile)) THEN ( ; the second argument is the password to be used when opening all config files. %ConfigurationFile("%ConfigFile","") ) ELSE ( %ConfigurationFile("[Sys]Config.Sys","") )FI %IF(%*isdef(%WsConfigFile)) THEN ( %WsConfigurationFile("%WsConfigFile") ) ELSE ( %WsConfigurationFile("[Sys]Ws###>Config.Sys") )FI %IF(%*isdef(%HwConfigFile)) THEN ( %HwConfigurationFile("%HwConfigFile") ) ELSE ( %HwConfigurationFile("[Sys]HW###>Config.Sys") )FI ;############################################################### ; NGen Module Definition ; Format is DefineXbusModule(id,size,fRMOS,fMode3Master) where size is in ; kilobytes. ; If a module has many ids then list each. ; Size can be 96, 224, 480 or 0(no window). ; Setting fRMOS to %TRUE makes the module addressable from real mode programs ; running under a protected mode OS. ; Setting fMode3Master to %TRUE means that the module is a master for mode ; 3 dma. If a mode 3 master is present on the xbus, the loader will only ; load programs above 16 megabytes which have been linked 'HighMemProtected' ; or 'HighMemGdtProtected' (see '[Run file type]' parameter of link form). ;################################################################ %IF (%CtosP) THEN ( %DefineXbusModule(47,96,%FALSE,%FALSE) %' /* PC001 */ %DefineXbusModule(49,0,%FALSE,%TRUE) %' /* QIC tape */ %DefineXbusModule(50,0,%FALSE,%TRUE) %' /* phone */ %DefineXbusModule(51,0,%FALSE,%TRUE) %' /* phone */ %DefineXbusModule(52,0,%FALSE,%TRUE) %' /* ethernet */ %DefineXbusModule(53,0,%FALSE,%TRUE) %' /* ethernet */ %DefineXbusModule(56,96,%TRUE,%FALSE) %' /* monochrome graphics */ %DefineXbusModule(57,96,%TRUE,%FALSE) %' /* color graphics */ %DefineXbusModule(60,224,%FALSE,%FALSE) %' /*GC003*/ %DefineXbusModule(61,224,%FALSE,%FALSE) %' /*GC003*/ %DefineXbusModule(62,224,%FALSE,%FALSE) %' /*GC003*/ %DefineXbusModule(63,224,%FALSE,%FALSE) %' /*GC003*/ %DefineXbusModule(68,96,%TRUE,%FALSE) %' /*GC102*/ %DefineXbusModule(80,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(81,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(82,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(83,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(84,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(85,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(86,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(87,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(88,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(89,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(90,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(91,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(92,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(93,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(94,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(95,96,%TRUE,%FALSE) %' /*GCX04*/ %DefineXbusModule(132,0,%FALSE,%TRUE) %' /* Unisys QIC */ %DefineXbusModule(195,0,%FALSE,%TRUE) %' /* Unisys EN3 */ %DefineXbusModule(196,0,%FALSE,%TRUE) %' /* Unisys TR2 */ %DefineXbusModule(197,0,%FALSE,%TRUE) %' /* Unisys ID2 */ %DefineXbusModule(200,0,%FALSE,%TRUE) %' /* ISDN */ %DefineXbusModule(201,0,%FALSE,%TRUE) %' /* SuperGen Ethernet */ ) FI ;############################################################### ; FINAL -- ; This macro does error checking, and fills in various ; counts in the tables generated by the above macros calls. ; ;################################################################ %Final END # ;################################################################ %IF (Clstr.Lib(SegOrder_P) Init.Lib(InitFs InitCMD InitNEC765C InitScsi InitScsi_53C94 InitScsi_6260 InitScsi_7770 InitScsi_ISK InitSeqCode_7770 InitWD2010 InitWD2797 InitWrapped) FsS_N.Obj OsLabl.obj OsLabl2.obj FileSys.Lib(BigMath ExpandSpecs FileLog FilePros_FS FsIo FsPeriodic Floppy_Nec765C Floppy2_Nec765C Floppy_Wd2797 Geometry_Nec765C HDisk_SCSI HDisk_WD2010 HfsDcb HfsDir HfsFab HfsFcb HfsFh HfsFhb HfsFile HfsLink HfsMain HfsNmb HfsPath HfsProcs HfsRun HfsUfb HfsVhb Lq_DWord_BSAC MassCache_L MassDma_N MassIo MDisk_CMD Mount OsSubset_FS ScsiDriver_53C94 ScsiDriver_6260 ScsiDriver_7770 ScsiDriver_ISK ScsiInfo ScsiManager ScsiUtil_ISK Status_FS Volume) OS.Lib(CommonSubs_FS CompatSubs_FS Data_FS DWordIo EntryPoint Math32 MulParUtil_FS SrpDmy_WS Vdm1Dmy) .0 ServiceInstallation ManagerIPFCLCopyLibrarianLinkLink V6Link V8Link XVT MSC ApplLink XVT MSC Lib ApplLink XVT MSC Real Mode ApplLink XVTPM ApplLink XVTPM Dll ApplListList Message FileList Request SetLock In CacheLogoutMailMaintain File  ;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: FsS_N.asm *; ;* *; ;* MACHINE: B20 LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION:  *; ;* *; ;* Parameters for a small-sized protected-mode file system. *; ;* *; ;* *; ;* HISTORY: *; ;*  *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;*  *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1990 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1990 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; $INCLUDE(Sysgen_Common.Mdf) %Begin EVEN ; MASS IO DEVICE CLASSES ; ; The SysGen must describe the initialization procedures to be used ; for different classes of hardware devices and interfaces. At boot ; time, the hardware is examined and each time a mass storage device ; is encountered, the array 'rgMassIoInit' is used to vector an ; initialization request to the hardware-specific procedure for the ; device class. ; ; NOTE: The MassIoInit macro MUST be invoked in ascending ; device class order, with no gaps left in the ; sequence. If a particular hardware class cannot ; be present on a system, the special entry name ; "Dummy" MUST BE USED as a place holder to generate ; the array correctly. %MassIoInit(InitWD2010) ;Device class 0: IDE/ST-506 disks %MassIoInit(InitWD2797) ;Device class 1: Floppy disks %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(InitNEC765C) ;Device class 5: Floppy disks %MassIoInit(InitISK) ;Device class 6: CT ISK Gate Array %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(InitCMD) ;Device class 10: Cache Memory Device %MassIoInit(Dummy) %MassIoInit(InitNCR53C94) ;Device class 12: SuperGen NCR 53C94 SCSI %MassIoInit(Dummy) %MassIoInit(InitAIC6260) ;Device class 14: PC/AT Adaptec 6260 SCSI %MassIoInit(Dummy) %MassIoInit(InitAIC7770) ;Device class 16: PC/AT Adaptec 7770 SCSI %MassIoInit(Dummy) %MassIoInit(Dummy) ;Device class 18: Nonexistent (config error) %MassIoDone ;############################################################### ; ; Space occupied by the tables below this location will be ; reclaimed by the OS after its initialization ; ; ANY RE-ORDERING OF THIS FILE MUST NOT CROSS THIS BOUNDARY !!! ; ; CTOS has been carefully constructed so that the various parts ; of CTOS reside either before this boundary (resident code and ; data) or after (initialization code and data). There are ; five segments which are used in controlling this: ; ; "code" ... anything in this segment will be resident ; "const" .. anything in this segment will be resident ; "data" ... anything in this segment will be resident if ; the module is linked before SysGen.Obj, or ; non resident if linked after ; "stack" .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization) ; ; The CTOS processes are allocated stacks out of memory ; reserved by the following macro call, and the stack segment ; is used only for a stack during CTOS initialization. ; ; The following macro is invoked with one argument, the number ; of bytes to be reserved for CTOS to use to build its ; structures, tables, and to allocate the stacks for the ; different processes (declared later in this file). The macro ; variable sOsData may be defined in the prefix file if ; desired. The OS will crash with as error 101 if this value ; is too small. ;################################################################ %ResidentDataBoundry(50000) EVEN ;############################################################### ; ; Table which describes the CTOS resident processes. Each ; process is described by 4 attributes: ; ; 1. Process entry point ; 2. Size of its stack ; 3. priority (0 is highest, 254 lowest) ; 4. default exchange (0 if not required, <> 0 allocs next available) ; 5. optional "check proc" name; if supplied (non-0), proc is called ; to decide if the process should be created ; ; Stack size -- ; The stack size for a CTOS process must be large enough ; for the largest local variable and procedure call sequence. ; ;###############################################################  %OsProcDesc(FileSystem, 656, 6, %TRUE, 0) %OsProcDesc(MassIo, 1024, 10, %TRUE, 0) %OsProcDesc(ScsiManager, 1280, 10, %FALSE, CheckForScsiHardware) EVEN ;############################################################### ; CTOS INITIALIZATION -- ; The following macros generate three tables of pointers which ; are used by FileSys during its initialization phase. All of the ; routines pointed to in these tables reside in modules which ; are linked near the start of the image, and the code for these ; modules is discarded after initialization is complete. These ; routines should have their code segments named "coed", and ; should use "data" for the name of their data segments. This ; is to insure that the Linker will place the code and data at ; the start of the run file, before the "ResidentDataBoundry" ; mentioned earlier in this file. The routines should obey the ; Convergent programming conventions related to register usage ; (refer to The Assembly Language Manual). The routines are ; executed at one of three times during initialization: ; ; InitProcHardware ; First after booted. This is the place to put hardware ; test and verification routines. ; ; InitProcIntDisable ; After structures have been initialized but before ; any processes have been started. This is the place to ; put hardware inititialization routines. ; ; InitProcIntEnable ; After interrupts are enabled these routines are executed ; as if they were a user program. (CTOS processes are running). ; This is the place to put initialization routines. ; ; The routines are called in the order given, with no arguments, as ; subroutines using the Assembly Language indirect far call instruction. ; %InitProcHardware(InitFsDataStructures) %InitProcHardware(InitSysConfig) %InitProcIntDisable(InitFsHardware) %InitProcIntEnable(InitFsMountDevices) %InitProcIntEnable(InitFsSysDevNum) %InitProcIntEnable(InitFsSystemTime) %InitProcIntEnable(InitFsFinish) EVEN ;##################################################  ############# ; System common subroutine definitions ; The macro takes number, name and procedural interface for each routine ; to be installed. ; ;################################################################ %SystemCommon(158, "UpdateFsDeviceName", "") EVEN ;############################################################### ; Interrupt routine definitions ; The macro takes device type, name, fDevice and fRaw for each routine ; to be installed. ; ;################################################################ %'Interrupt(tyRS4221, "SigIsr", TRUE, TRUE) EVEN ;############################################################### ; RTC initialization ; Externally defined RTC blocks may be initialized at installation ; using the RtcRq macro. ; Arguments are ; public name, timeInterval, resetValue, cEvents, exchange, rqCode. ; ;################################################################ %RtcRq(rqTimeAvr,10,10,2,0,0)%' for PC Auto-mount polling %RtcRq(trbFsPeriodic,10,10,2,16,0)%' for Fs Periodic (cache cleaning) EVEN ;################################################################ ; File system miscellaneous data structures ; Change these setting as needed ; %SET(nDisk, 12) %SET(nFloppy, 4) %SET(nMemDisk, 2) %SET(nSCSI, 4) ; nFcb and nFab get overitten by the values in vClstrLfs.asm or vStnd.asm. ; The values should be specified there so that they will not display as zero ; when the Knob (MiniCustomizer) is used to edit sysgen parameters. %SET(nFcb, 300) %SET(nFab, %nFcb*2) %SET(fVerifyFileStruct, 0) %SET(nFub, %nFcb*2) %SET(nIob, %nDisk*5+%nMemDisk*2) %SET(nLucb, %nDisk+%nScsi) %SET(nUpb, %nLucb*2) %SET(nScsiIob, %nIob+2) %SET(cbNameSpace,%nFcb*25) %FileSystem(NGen) EVEN ;############################################################### ; DEVICE DECLARATIONS ; ; The device declarations reserve Device Control Blocks (DCB's) for all ; mass storage (i.e. direct access) devices that are anticipated on a ; particular OS. The only function of the DCB declared at system ; generation time is to associate a device name (e.g. F0, D0, D5 and so ; on) with the device. The ACTUAL DCB's are dynamically allocated by ; initialization code; the device name, device password and retry limit ; are copied from the DCB declared below into the actual DCB. ; ; There are three families of devices recognized: floppy disks (either floppy ; or SCSI interfaces), rigid disks (either SMD, ST-506 or SCSI interfaces) ; and memory devices. Conventional CTOS names within these families are ; Fn, Dn and Mn (where n is the device ordinal within its class), but these ; are configurable by the user. ; ; The DcbTemplate macro is used to declare the system generation DCB. ; ; DcbTemplate(deviceFamily, "deviceName", "devicePassword", retryLimit) ; ; NOTES: Device family must be 'floppyDisk', 'rigidDisk', ; 'memDisk' or 'miscDevice' ; Device name and password are limited to 12 characters %DcbTemplate(floppyDisk, "F0", "", 4) %DcbTemplate(floppyDisk, "F1", "", 4) %DcbTemplate(floppyDisk, "F2", "", 4) %DcbTemplate(floppyDisk, "F3", "", 4) %DcbTemplate(rigidDisk, "D0", "D0", 8) %DcbTemplate(rigidDisk, "D1", "D1", 8) %DcbTemplate(rigidDisk, "D2", "D2", 8) %DcbTemplate(rigidDisk, "D3", "D3", 8) %DcbTemplate(rigidDisk, "D4", "D4", 8) %DcbTemplate(rigidDisk, "D5", "D5", 8) %DcbTemplate(rigidDisk, "D6", "D6", 8) %DcbTemplate(rigidDisk, "D7", "D7", 8) %DcbTemplate(rigidDisk, "D8", "D8", 8) %DcbTemplate(rigidDisk, "D9", "D9", 8) %DcbTemplate(rigidDisk, "D10", "D10", 8) %DcbTemplate(rigidDisk, "D11", "D11", 8) %DcbTemplate(rigidDisk, "D12", "D12", 8) %DcbTemplate(rigidDisk, "D13", "D13", 8) %DcbTemplate(rigidDisk, "D14", "D14", 8) %DcbTemplate(rigidDisk, "D15", "D15", 8) %DcbTemplate(miscDevice, "Z0", "", 4) %DcbTemplate(miscDevice, "Z1", "", 4) %DcbTemplate(miscDevice, "Z2", "", 4) %DcbTemplate(miscDevice, "Z3", "", 4) %DcbTemplate(miscDevice, "Z4", "", 4) %DcbTemplate(miscDevice, "Z5", "", 4) %DcbTemplate(miscDevice, "Z6", "", 4) %DcbTemplate(miscDevice, "Z7", "", 4) %DcbTemplate(memDisk, "M0", "M0", 8) %DcbTemplate(memDisk, "M1", "M1", 8) ; SCSI Manager Declarations ; ; The following are the vendor ID and product ID for the GP/SI, which is a SCSI ; device. These values are copied to scsiMgrInquiryData by initialization code. ; See InitScsi_53C90.Plm and ScsiDriver_53C90.Plm for more information. ; Size of ScsiMgrVendorId must be 8. Size of ScsiMgrProductId must be 16. ; Size of ScsiMgrVersion must be 4. %IF(%*isdef(ScsiMgrVendorId)) THEN ( %SetScsiMgrVendorId("%ScsiMgrVendorId") ) ELSE ( %SetScsiMgrVendorId("UNISYS ") )FI %IF(%*isdef(ScsiMgrProductId)) THEN ( %SetScsiMgrProductId("%ScsiMgrProductId") ) ELSE ( %SetScsiMgrProductId("SCSI Manager ") )FI %IF(%*isdef(ScsiMgrVersion)) THEN ( %SetScsiMgrVersion("%ScsiMgrVersion") ) ELSE ( %SetScsiMgrVersion("3.3 ") )FI ; Summarize dcb structures in Gen. %CreateGen EVEN ;############################################################### ; FINAL -- ; This macro does error checking, and fills in various ; counts in the tables generated by the above macros calls. ; ;################################################################ %Final END e for each routine ; to be installed. ; ;################################################################ %SystemCommon(158, "UpdateFsDeviceName", "") EVEN ;############################################################### ; Interrupt routine definitions ; The macro takes device type, name, fDevice and fRaw for each routine ; to be installed. ; ;#####################################################Init.Lib(InitPsAlloc InitClstr_WsP InitCluster InitWrapped) OS.lib(Data_FS) %' NGenPortsStructure, oMemAvail, pSysTime Clstr.Lib(Data_Clstr) %' Config, NetServerData, xBlk stuff Clstr.Obj %' Init proc tables OsLabl.obj OsLabl2.obj OS.Lib(CommonSubs_Cl EntryPoint) Clstr.Lib(AgentCache FilterPros_Lfs OsSubset_Cl WsAgent_P WsLph_P WsXBlock) les I checked in are InitWrapped.plm, InitClstr_all.plm, and InitMaster.plm. Copies of the modules before I checked in are on my [sys]directory. The mo; ; FILE Clstr.Asm -- ; ; COPYRIGHT 1990 CONVERGENT TECHNOLOGIES, INC. ; ALL RIGHTS RESERVED ; ; THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE ; SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A ; PARTICULAR PURPOSE, AND MAY NOT BE COPIED OR OTHERWISE USED ; WITHOUT THE PRIOR WRITTEN CONSENT OF CONVERGENT TECHNOLOGIES, ; INC. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS ; SOURCE CODE, SHALL AT ALL TIMES REMAIN IN CONVERGENT ; TECHNOLOGIES. ; $INCLUDE(Sysgen_Common.Mdf) %Begin EVEN ;################################################################ ; The following list of request codes are those requests for which the ; cluster agent will NOT mark the user as using resources on the master ; and therefore require no termination on the master. Clusters ; which issue to the master only the requests which are in this list will ; not have termination requests sent to the master. ; ;################################################################ %RequestNoRemoteTermination(14) ;GetDateTime %RequestNoRemoteTermination(235) ;CheckForMail %RequestNoRemoteTermination(101Ah) ;RemoteTermination %EndRemoteTermination ;############################################################### ; ; Space occupied by the tables below this location will be ; recalimed by the OS after its initialization ; ; ANY RE-ORDERING OF THIS FILE MUST NOT CROSS THIS BOUNDRY !!! ; ; CTOS has been carefully constructed so that the various parts ; of CTOS reside either before this boundry (resident code and ; data) or after (initialization code and data). There are ; five segments which are used in controlling this: ; ; "code" ... anything in this segment will be resident ; "const" .. anything in this segment will be resident ; "data" ... anything in this segment will be resident if ; the module is linked before SysGen.Obj, or ; non resident if linked after ; "stack" .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization) ; ; The CTOS processes are allocated stacks out of memory ; reserved by the following macro call, and the stack segment ; is used only for a stack during CTOS initialization. ; ; The following macro is invoked with one argument, the number ; of bytes to be reserved for CTOS to use to build its ; structures, tables, and to allocate the stacks for the ; different processes (declared later in this file). The macro ; variable sOsData may be defined in the prefix file if ; desired. The OS will crash with as error 101 if this value ; is too small. ;################################################################ %ResidentDataBoundry(20000) EVEN ;############################################################### ; ; Table which describes the CTOS resident processes. Each ; process is described by 4 attributes: ; ; 1. Process entry point ; 2. Size of its stack ; 3. priority (0 is highest, 254 lowest) ; 4. default exchange (0 if not required, <> 0 allocs next av  ailable) ; 5. optional "check proc" name; if supplied (non-0), proc is called ; to decide if the process should be created ; ; Stack size -- ; The stack size for a CTOS process must be large enough ; for the largest local variable and procedure call sequence, ; plus enough space for all possible interrupts that can occur. ; CTOS requires 64 bytes of user stack to save the context of a ; process when an interrupt occurs. ; ;############################################################### %OsProcDesc(WsAgent, 300, 3, %TRUE, 0) %OsProcDesc(LclFsFilterProcess, 256, 7, %TRUE, 0) EVEN ;############################################################### ; CTOS INITIALIZATION -- ; The following macros generate three tables of pointers which ; are used by WsAgent during its initialization phase. All of the ; routines pointed to in these tables reside in modules which ; are linked near the start of the image, and the code for these ; modules is discarded after initialization is complete. These ; routines should have their code segments named "coed", and ; should use "data" for the name of their data segments. This ; is to insure that the Linker will place the code and data at ; the start of the run file, before the "ResidentDataBoundry" ; mentioned earlier in this file. The routines should obey the ; Convergent programming conventions related to register usage ; (refer to The Assembly Language Manual). The routines are ; executed at one of three times during initialization: ; ; InitProcHardware ; First after booted. This is the place to put hardware ; test and verification routines. ; ; InitProcIntDisable ; After structures have been initialized but before ; any processes have been started. This is the place to ; put hardware inititialization routines. ; ; InitProcIntEnable ; After interrupts are enabled these routines are executed ; as if they were a user program. (CTOS processes are running). ; This is the place to put initialization routines. ; ; The routines are called in the order given, with no arguments, as ; subroutines using the Assembly Language indirect far call instruction. ; %InitProcIntDisable(InitSysConfig) %InitProcIntDisable(WsInit) %InitProcIntEnable(DAIIntoXID) %InitProcIntEnable(PrepareIdSearch) EVEN ;############################################################### ; System common subroutine definitions ; The macro takes number, name and procedural interface for each routine ; to be installed. ; ;################################################################ %SystemCommon(128, "FSrpUpProc", "") %SystemCommon(202, "FMasterRqSentTestAndClear", "w") %SystemCommon(222, "ConnectAgentCache", "ww") %SystemCommon(225, "GetClstrGenerationNumber", "p-") EVEN ;############################################################### ; Interrupt routine definitions ; The macro takes device type, name, fDevice and fRaw for each routine ; to be installed. ; ;################################################################ %Interrupt(tyRS4221, "SigIsr", TRUE, FALSE) EVEN ;############################################################### ; RTC initialization ; Externally defined RTC blocks may be initialized at installation ; using the RtcRq macro. ; Arguments are ; public name, timeInterval, resetValue, cEvents, exchange, rqCode. ; ;################################################################ %RtcRq(timerRq,20,0,1,12,0)%' for timing out master, see :ClusterTimeout: %RtcRq(rqClock,0FFFFh,0FFFFh,1,0,0)%' for statistics in ClusterStatus %RtcRq(rqTimeCws,300,300,0,17,14)%' for GetDateTime polling' EVEN ;############################################################### ; FINAL -- ; This macro does error checking, and fills in various ; counts in the tables generated by the above macros calls. ; ;################################################################ %Final END .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization)  ClstrAgentWrap R12.3.1COED ClstrAgent` AgentGW]`u`.opwVer Clstr R1.1.0 Linker R12.3.1o_0_߉0P`_OP_ `bw v r/u    5 N e      H m~#3CSctTWDYm3Rgw 9d2'4?2Hi5(^dVc.;fz Q l    r    &F F .F F $    F K   * K \ s m       4 : M [ ` e u +;K[k| vLau ';Zo^:/G/ ///,/0/4/8/</B/N/R/Z/^/f/j/r/x///^x= #Y_ / #      2 L r     >F fF F F F +F KF F F F F F }F F F F UQQQ t43PP tأ橋䩍+£3੍੣쩋F %F ȡ t+sF tF t+r詡+"ډV v FP=u F^&]UF t@sP tvl]UF&PFF@sTvRPWSWNQNQSPP;Vu;FtPSwFV+^vvv욇ȯvvv욤ʯ&G&G&G &G&G&G&G+1&G &G &G s+&G `&G ")&G &G "PFF@sTvRPWSWNQNQSPP;Vu;FtPSwFVvvv욇įvvv욤Ư P6vP]U젳sF FV ]U> u FV &<t<t<t<u2sFV FV %]U^ ~ uFF ;FsF@r~uFPFP*FPFPEPFFPRP^WSWNQNQSPPF;Vu;Ft/6F$vFFNFPQwFV~t^@sF ;Ft @r~uFVFHN~׉FV##;t6^ ?uF F^&F^&G ^&G ǫs4^O"QV+RP^GPFP<P@^G"FVRPvꚇ^&G^G"FVRPvꚤ^&G^&G&G^&G&G^&G^&FFFFt]U<t <u6ì:u :uЫs >u)ᯢ㯸"Pru K>up>uk>|u%ᯊЫs #IE&ᯊЫs  JFp@FаWᯊsD> u s>urPruHsگ#گ">u Ыr><t7<t3>u 鯸"H> usܯEޯEe>uL*4rPruܯEޯE%ܯDޯEگ"ܯDޯEs&F毰 t u毰v]Ux(]U&G$u&G&G#>u#&&'P*@s"P<PPPP<<¯&4]U$&G"s&$&$&G!M&G#*)F]U>"u &G]ˡ"@&G]Uj=vcPhvcPhvcPjHvcPjdvcPhvcPjovcPhpvcPhqvcPjvcPj3vcPhvcPjvcPj>vcPjIvcPjpvcPhvcPhvcP]D@s1FF^jRQjPjAP^&w &w1^&G3s&w4F t j(jPjh@jP/PhLjP/P^&Gt^& u&G ^&u&G@^&G t^&Gt^&Gt^&Gt^&G"&G $&O1Ƭp&G% ^&_+&&G&G  &G &G&G džF N NNPj }@s'vFPhP^NiPs0>u@%9Fvjel+FF2>u @%F@+N;sjelFFUvF]@sFPFP*PV<>%<>^  ^~RPSju^FFV<>Fh@jP/Phj$P/PjjFP/PvT F&8:TKjj(P/Pj(j0P/Pj&jP/P6-Fj#j̬P/Pūs3jjȬP/Pj"jЬP/P$&G'Qj$j4P/PhjP/PFPPF% ⬠ūsjPjB8PB*@r^ &&W<>^ SYFV@sFFFFF;vxH ؍F؋  uF FP^_ Fr'^F׌F١F݉F߉FwF^GF@sFF^trFP(P^&F ;vN^wFNFFAF% RPAPRPFNQPFPLPF RPRPRPF RP^SRP^&F@NFNFt|FF;wHćFF^FuFF;wHć FF^Fuރ>tgFHN;rW؍V^^FFO& O&LO&LO &LO &L &DP1PFuFF;wHćFF^FuFF;w"GB @$@2䬼<,<A BC Ej v쭼,,3..22o$a& > `333333333333` b0s`V+XXZ@DHLPTX  \`dhlptx|  wwwp- Clstr R1.1.0WsAgentLclFsFilterProcess DAIIntoXIDPrepareIdSearch 6G69Gw6GUvF~ F ;uV^ :t3]Uv<\DD&]&E؉?G]Uv ~D&}u!&&Etrt &O;r;s\&G;t! u&Gr &Gꭚ&G&G%歸 PP F쭌;6u;u  Ƭ;tZ 6&D&6&D&G6&Ds%&G s> &&E&G.'&G&O#ʉ譳 Ê*1+%:v ƭ tun>ƭu>u*&G t&O⭣ P֭PF8s>r660&G >ƭ.u>3u7s&w &w&G PPF>u[ PPfF&G rF PPDFF tt t>uFFF&GSF tPl U &^F&G ^&GvS F^&w FPF tPl^&G]UF&GN&O++&W&Gs&Gr&Gr&Gs/FFFFVvvFNPQDFFPT]6$@P9Bu@=juB=u t3& u$pڨt$uǨt $붨t $맨t &áP@=uP">t & >t & 3 @&6;thl &<t,&G &g <uSRp3,>t >t  3򮢰" 822t >*F33 U@>"t&G uN&O&G S &;s0&&H[uB &b3&O&O&O&UB^b;~-&W&o &&9?r& tZuDsD>, 8u[(&>RuL&Et<(&>P t,@& t"hG>dfRKr>, 8W>ꬋ_t>, B@r8@&GS]Ë..uV>>uJPQW><&3<.G.>>>0_YX른)ÉGO>4vG3GGG G GGG WGUF&$&,F^O tF~&} ou&} uVO22t<;^t3 t-;Ou(&E3(G &E GGSQWY[뾋^&E t PlGubF^G`t x F^&>>&M$wT|t06OUF^Ow UF^36F&:&8$&4&6+DTRx)u;|s|6;t6O+|+Z t &)8y33|D&686O tffffF&.;GG=GOG8GwG`"GGGOGw|t ,GSw J&M &L^f4>.( &d &D  &T f&T F&Mn& &GG^WV6G6G&ML>. >.26G3^_F~\^~vL 4&;M ;F-7&=$ffffv~FN뜎F&.^PFq]U2>8tu t&=t֌F ^2 F jF~&M&E &;0&&H^^ QG C>7;/Q&M &E:Y &}QY^"&} uB &MZ&} v*&E&u&w &dGFO`c6ƀ &MG WJ&#U+EB&9EDO3 1G)G!&U+W GG`;V2r8> &E >  +NGWF&GvLN쥥KFFT6O &6G` 6H&!ETFV 3V6O 9  686O6G`6~vffff3&&v~VVv^F X@$-$&&GL4P Xffff^v^FNv^G>&>0 6N-$&$@@&^G$<&} Y&E G@&&&(&0#G`   'RG&*&2- &DF&O G& u&:&]Ë57\Ë7|5ËW*,ÃPG&G: X  &MG`&M G  H&&M &} &EGv;+и+3Gnprt;v@v;fhj;l l\^`b;ddV>0H"oG=R Ì;P[ëFFFF & Ë2=Ѐؠ"2؋6_ &3"&G3؋6_*3Ȁ'|PU6>t4$Du6>ȭȭȭȁCAũ DLt&=6;>D&9Eu&9M u&&6&9&D&;E D&;Ea6>&1&&E &&;&&&&3H &&&;&&E=96N&6;&9Ou&9Wu&GA& 6&M(& &&& &;&F]X6> t&?6;>f&9Mu=&9Eu&&66&9&&&&&u6&L&D&L&D&T6> _&=6;>Q&9Mu&9Eu&&66&9&&&&;&&uw &D&tV&&&66&76;60&9|u&&6&9&&& &P6666h 66]SjjP4X^Uw&4&6&>>&M$&6. &}3&}*&M&E ?&u &uRP &E $&E &Uă66Pj-P-P==yFXZ_68$6ffffY6666RP@QQ]U졎H&M&U#&#E&U&} v &E&U&EtS&E ?&u &uRPQ66FPjFPFP=YXZ[[Q66RPjjYFV+w[]S&4&6 &E[ &E ?&u &uRP&u&u 66Pjvj8FPYZ[ {&6%?;С;33*2ɋH##&;4r&>.&.w:X66vv%@PP3U^]@>3 6 >#tVU>t>juZ 6uV7 9 rt :v]u,u'<t#<@w>#t:uط:s6V r;&;r!ì拜& 2늟A&tƇ덊ì >u ^tt&&~ &: :u|&& s& r 2㋟';r!ìc + && :t^ :v ^utuu.u$ut#t(t1rc>v>:tɻ22ttG&G:&;>$t X:6t RE&.!t:P&( &&؋3Ɋ&W*B@@@$;Xt땀 &,22t;w t: ~ ~. ~&0&} Ht &} ut&;U ut3%# á u.r RPdutu+(>v72/?utu(>v75u2uVt(ut *">uÌ&>t&& :u$ & ;Rt3  t& & ÉuT > s:uË6VX >N*3ˁ>t Plj3n9u $@t$@t˜e6t*>u#u?t?6 Pl3 t$ &&ȯtHʯA &"&tH&&>:t >v&%tAI8t 䯠u;QììYdܯQVì6¯nܯ ìnìn^Y>ìvIPtЫt(ޯ u︅ Xz uˋuPt毜=t鯋X us ut V6¯ìn^jnuįƯ&&IHگtЫt ˋ6&H|>>tP-N$tΆuӨttuֹtЫt%QìȋuQ u{Y3uu & &>&" u >~:u  Vɶˢ@u?ȋ@À>u@@À>t>u682Ë@B2Á>u?tЫt'ޯ u︅8X> tjtЫt  *ìȋu u3I 3<>uuË6>t >tËRS؋3Ë|;thl[~XË> tīut&0 t ċ0àோË>3~읊t+OOËpQd$tYU t& PPv|١ȡ1񣳬^1&G 6 W66P]U>t>J r ^Sw^Sw]UQQ^SwFV>t58u FV@> u FV<t<uFV5>uFV%FV %]U^ ~uF;sN>׃####;u;t6RPFHPPu^ ?u  &F&G &G G"Pp&GG"P&G&G&  Ft] LIBRARY: Init.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:51) LIBRARY: OS.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:47) LIBRARY: Clstr.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:49) COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED. Init.Lib(InitSrvrAlloc InitClstr_MstrP InitMaster InitWrapped) OS.lib(Data_FS) %' NGenPortsStructure, oMemAvail, pSysTime Clstr.Lib(Data_Mstr) %' Config, NetServerData, xBlk stuff Srvr.Obj %' Init proc tables OsLabl.obj OsLabl2.obj OS.Lib(CommonSubs_Cl EntryPoint) Clstr.Lib(AgentCache OsSubset_Cl MstrAgent_P MstrAgntSubs_P MstrCache MstrLph_P MstrMart) .............. F........................KnobFileName.plm.................................. F........................KnobMessage.plm..................; ; FILE Srvr.Asm -- ; ; COPYRIGHT 1990 CONVERGENT TECHNOLOGIES, INC. ; ALL RIGHTS RESERVED ; ; THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE ; SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A ; PARTICULAR PURPOSE, AND MAY NOT BE COPIED OR OTHERWISE USED ; WITHOUT THE PRIOR WRITTEN CONSENT OF CONVERGENT TECHNOLOGIES, ; INC. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS ; SOURCE CODE, SHALL AT ALL TIMES REMAIN IN CONVERGENT ; TECHNOLOGIES. ; $INCLUDE(Sysgen_Common.Mdf) %Begin EVEN ;############################################################### ; ; Space occupied by the tables below this location will be ; recalimed by the OS after its initialization ; ; ANY RE-ORDERING OF THIS FILE MUST NOT CROSS THIS BOUNDRY !!! ; ; CTOS has been carefully constructed so that the various parts ; of CTOS reside either before this boundry (resident code and ; data) or after (initialization code and data). There are ; five segments which are used in controlling this: ; ; "code" ... anything in this segment will be resident ; "const" .. anything in this segment will be resident ; "data" ... anything in this segment will be resident if ; the module is linked before SysGen.Obj, or ; non resident if linked after ; "stack" .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization) ; ; The CTOS processes are allocated stacks out of memory ; reserved by the following macro call, and the stack segment ; is u  sed only for a stack during CTOS initialization. ; ; The following macro is invoked with one argument, the number ; of bytes to be reserved for CTOS to use to build its ; structures, tables, and to allocate the stacks for the ; different processes (declared later in this file). The macro ; variable sOsData may be defined in the prefix file if ; desired. The OS will crash with as error 101 if this value ; is too small. ;################################################################ %ResidentDataBoundry(40000) EVEN ;############################################################### ; ; Table which describes the CTOS resident processes. Each ; process is described by 4 attributes: ; ; 1. Process entry point ; 2. Size of its stack ; 3. priority (0 is highest, 254 lowest) ; 4. default exchange (0 if not required, <> 0 allocs next available) ; 5. optional "check proc" name; if supplied (non-0), proc is called ; to decide if the process should be created ; ; Stack size -- ; The stack size for a CTOS process must be large enough ; for the largest local variable and procedure call sequence, ; plus enough space for all possible interrupts that can occur. ; CTOS requires 64 bytes of user stack to save the context of a ; process when an interrupt occurs. ; ;############################################################### %OsProcDesc(MstrAgentReceiver, 500, 3, %TRUE, 0) %OsProcDesc(MstrAgent, 500, 4, %TRUE, 0) %OsProcDesc(MstrMart, 500, 4, %TRUE, 0) EVEN ;############################################################### ; CTOS INITIALIZATION -- ; The following macros generate three tables of pointers which ; are used by WsAgent during its initialization phase. All of the ; routines pointed to in these tables reside in modules which ; are linked near the start of the image, and the code for these ; modules is discarded after initialization is complete. These ; routines should have their code segments named "coed", and ; should use "data" for the name of their data segments. This ; is to insure that the Linker will place the code and data at ; the start of the run file, before the "ResidentDataBoundry" ; mentioned earlier in this file. The routines should obey the ; Convergent programming conventions related to register usage ; (refer to The Assembly Language Manual). The routines are ; executed at one of three times during initialization: ; ; InitProcHardware ; First after booted. This is the place to put hardware ; test and verification routines. ; ; InitProcIntDisable ; After structures have been initialized but before ; any processes have been started. This is the place to ; put hardware inititialization routines. ; ; InitProcIntEnable ; After interrupts are enabled these routines are executed ; as if they were a user program. (CTOS processes are running). ; This is the place to put initialization routines. ; ; The routines are called in the order given, with no arguments, as ; subroutines using the Assembly Language indirect far call instruction. ; %InitProcIntDisable(InitSysConfig) %InitProcIntDisable(SetUpIoAddr) %InitProcIntEnable(InitMstr) EVEN ;############################################################### ; System common subroutine definitions ; The macro takes number, name and procedural interface for each routine ; to be installed. ; ;################################################################ %SystemCommon(128, "FSrpUpProc", "") %SystemCommon(136, "GetDAINumber", "p-p-") %SystemCommon(222, "ConnectAgentCache", "ww") EVEN ;############################################################### ; Interrupt routine definitions ; The macro takes device type, name, fDevice and fRaw for each routine ; to be installed. ; ;################################################################ %Interrupt(tyRS4221, "SigIsr", TRUE, FALSE) EVEN ;############################################################### ; RTC initialization ; Externally defined RTC blocks may be initialized at installation ; using the RtcRq macro. ; Arguments are ; public name, timeInterval, resetValue, cEvents, exchange, rqCode. ; ;################################################################ %' RtcRq(timerNumber,0FFFFh,0FFFFh,1,0,0)- for statistics in ClusterStatus OBS EVEN ;############################################################### ; FINAL -- ; This macro does error checking, and fills in various ; counts in the tables generated by the above macros calls. ; ;################################################################ %Final END his segment will be resident ; "data" ... anything in this segment will be resident if ; the module is linked before SysGen.Obj, or ; non resident if linked after ; "stack" .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization) ; ; The CTOS processes are allocated stacks out of memory ; reserved by the following macro call, and the stack segment ; is u SrvrAgentWrap R12.3.1COED SrvrAgent SrvrAgent_002b`5 AgentGW`-dx2AbwVer Srvr R1.1.0 Linker R12.3.1 _?7 /_O0O.w  r/u    _   h       .?tW((((D(Y(m(((((((3(R(g(w(((( (9(d(2(((('(4(?(2Hi858(>^>>d>c)cccJc,cPc ccJ}'Ir?  5`7`k`w`` (8>c}`a  ( <  g     ( L         _ {  %6G|((((L(a(u(((( ('(;(Z(o(((((^(((:((((/(G( .26:@LPX\d^x8=8 >#>Y>>_> > cccc%c6cGccIcccccc/cnc{cccccccocccccC c c c c cT cs cO c c c c ccc%c3c;ccccc;cccc#c+cccpccc}}};}O}}}}*})}k}' 2 ``S`?```UQQQ X t43P$XP tأ&X$X@W+£(X3 X@W,XF %F ȡ.X t+.Xs.XF tF(X t+r(X,X+,X"ډV (Xv FP=u F^&]UF tbXsP dv\]UZZ `FF t؍`FPFFZZbXsTvRPWSWNQNQSPP;Vu;FtPZSwFVZ^G,Ys-ZSPP^G&PFP<P(vvv욡^G&vvv욾^G(@_Z&GZ&G^Z.hnZ&GZ&G 3Z&G ?Z&G Z&G Z&G "YsZ&G Z&G `Z&G Z&GZ&GZ&GZ&GZ+Z1Z&G Z&G Z&G PFFZZbXsTvRPWSWNQNQSPP;Vu;FtPZSwFVZ^G*Ys-ZSPP^G"PFP<P(vvv욡^G"vvv욾^G$Ft;ZZ `M_W6ZPPM_Q_```K_W 6Z6 `PZ+`u_Z+`v_X__(Z_Z`Z `[&G"Z[&G(]UYsF FV ]U>X u FV &X<t<tX<t<u2YsFV FV %]U^ ~ u!FF ;FsFbXr~uFPFP*FPFPEPFFPRP^WSWNQNQSPPF;Vu;Ft/`F$vFFNFPQwFV~t^bXsF ;Ft bXr~uFV2X4XFHN~׉FV##;t`^ ?uF F^&F^&G ^&G Ys4^O"QV+ZRP^GPFP<P@^G"FVRPvꚡ^&G^G"FVRPvꚾ^&G^&G&G^&G&G^&G^&G&W^&FFFFt]UDXDXtN؍`>XGG>XGG>XGG>XGG >XG G >XG G>XGG> XGG>XGG6 P>XGBWD>XGF؉GF[_>XGJ_L>XNDW>XG[>DXu >XGX >XGX@DXZ.AG>XG^>XG2@>XG4>XG{>XG03[>X:Xc_BXk_b_>XG^>XG2s>XG4>XG{>XG0[>X8Xc_AXk_TYs>XG^>XG2U>XG4>XG{>XG0`[>X6Xc_@Xk_b_>XLJ>X>XDX>XO >XG>XGh>XG4GH>XG:PP__>X1w4GZDXt]UYr ZZZZZs_ZFFFux؃ZtfF^㋇ZH;FrPFz`^FFGF^GF؍`^GF@^Gv FuFuq_Z@PFFW_Y_Z@Ȱ>W_]UFFu`؍`^G^YsYrYr ^ ^FuYs 搰X搰摰Ys`#`">Xu Yr>X<t7<t3>Xu`` ```"H>X uYs`E`Ee>XuL``*`4``YrPru`E`E%`D`E`"`D`E``s&F` t u`v]UQYs[& U_U_Z@PZZ@PZZzP`bXs`&\ ]UFX&G!oZ&G#LZ)F8lZrLZ>lZ rLZ LZ LZFX&]Y&G"s{&a(a*a,aJapX2a .a 8a9a0a :a;aHalXDajXFahX@abXBa`XLa@X>afX4a`6a`JY&Gr&Gr&a(a*a,aJa2a .a 8a9a0a :a;aHaDaFa@aBaLa>a6a4aY&Gr&GrEjjFP/P&a(a*a,a2a.a8a9a0a:aH;aD^&GFJa&GDHa&G@Da&G>Fa&G8@a&G6Ba&GHLa&G<>a&GL6a&GJ4aaf6a44a6Y&Gr&GsY&Gs&Gr&a(a *a,aJap2a.a8a9a0a&Os :a;a :aH;aDHanDajFah@abBa`La@>af6a4aYu`YY%Y9Fvje\Y+FYF2>Yu bYY@%YF`+N;sje\FYFUvF]bXsFPFP*PV^X`X%^X`X^^~RPSju^FFV^X`XFh@jZP/PhjFXP/PjjFP/PvvX FHXZX\XvZKjjJXP/Pj(jRXP/Pj&jYP/P6YY-Fj#j[P/PYs3jj[P/Pj"j[P/PFX&G'sZj$jVXP/PhjZP/PFPPF% [ "[Ysj ZPjB8PZB*bXr^ &&W^X`X^ SMYFVbXsFFFFF;[vxH ؍$[F؋  uF FP^_ Fr'^F׌F١YF݉F߉FwF^GFbXsFF^trFP(P^&F ;vN^whXNFFcXF% RPcXPRPlFNQPFPDPF RPRPRPlF RP^SRPl^&F@NFNFt|FF;[wHć[FF^FuFF;[wHćL[FF^Fuރ>[tgF[HN;rW؍[^^FFO& O&LO&LO &LO &L &DP1PFuFF;[wHćX[FF^FuFF;[w$ uvdzH0=  [Sys]WsNNN>SysImage.sys[sys]ws>crashdump.sys Srvr R1.1.0 `3Sync"GBD@@$@ QR `bf }\#$[ rm H`3G_o__ 33  S  MstrMartLPT X\`dhlptx |   p-p-wwMstrAgentReceiver MstrAgentMstrMartInitMstr6G69Gw6GUvF~ F ;uV^ :t3]Uv<\DD&]&E؉?G]Uv ~D&}u!&&E"[t^㊇ Z:sZtF|^Sp^&G s ZrSZsR`s N^&GZ`o_FYr ^&G!M^&G rZs&G.z^&GFZ;sF t؊ ZZ6ZFVZ+ZKK9,>ZZ3KKF+Z[ hZU_]UF&&>0O&,& 3ҊWR&6*&0=O=]=qZ>|ZkСZPZ^*Bd& >0H]( &3ɋʀ*G΀3W*uBpCOWQ;X;G>0#dG£$&  ;q3Ɋ(\&\(\*C)""\&\(T* C>D@D8H:^oVW_^GM_ __V6[_&D._&D0^v_v_V6[&D,&;D*&D*^M_3&&M_^ & &VD&DD^G&$&^؃&^F/ ؎[&,& &>0_>Z&.. 3ҡ[3,Z&G&O&_  ȁ33&>&@[&ShZ Eڣ.3Ɋ)&(؃ &3G&G(G*CCC$CC ]X-뱋D:QZ>ZYY8FFÀ >2&"&MO&LR&64F=&4R&6*RPF&2X 0S3Ɋ(\&\(\*Cވ[) S\&\(T* C[U^ 0H $ >0#26">؎D<$$> 8$'3Ɋ)&)G&G*@$$@@ ]&w  P\39u& USRێF &;`5Z ,Hz`;vGv^&3 #Z[]U 0\ .\u.\FF^&;.\u^FNFN&T;VuՋ&W;Vuʋ&^&.\&G;FuF&G.\&v&N.\&;.\u&O,\^&ONFَ&G":u ЉFV^Ë]U^G&FF&ONF(_؋F\F\v&D\&D \Ƈ\v&D&T\\&D\\v&D\v&\(_@%(_]U^SNIPZ^&G @t-&g &G t,\FN&L^&G^&O @v &DFF^&t \\SFCP^ &w &w^F t2^&G$<v^ & uu^&O~\r ^&Gu^&GFv&D^ &G&D^ &G&D^ &G&W&D&T 2\H^ &!G&!W2\&Gv&Dt!^&G ^ &&G&G&G #^&g FF^SOCP%^&G t&g FF,\&ONF^SRPPF^&O&W ^ &+O&WN;2\rىNF^&N;v+FFNF^&W;v+ЉV^&G u;v F&D&LV^&W^ &_QN^YFF^ &G tt^GPPP ^GPFPP ,\^&ONFَ&Ov &9TuN~&5 tD^ & w&G^&O & &w &G## t &g &g?^ 2\&G&WFF^&^SNTPAFF^&;Gr^ &tv&D&T FV^ &G&WFV^&G &W% t ff?2\^&v&D &T% ui^ &GN~v&\ &L;u;vB^ &G^&G ;Nu;Fs ^&^&G &W%+FV^&4_F6(\6&\FPP^ GP^GPF u \\K~yu"\\^SMCP^&g K~zuG^& t=\\SLCPF;4_tf^&G $&G v^& u *_,_ \\^SCNPu^& G tF ^&^ &G^SDCPJ^&Gv&L^&O&W v &L&T&L^&Wv &T&L^&O^ &Ov&; u^ &u&G^&G t^ & &G&G u^SDCP^&?u@^ &tA ^&O ɱuA ]U^ &GFF^&G u&&g &u,\^&ONFَ&Gu&T&| V~2\J^ &G&w##V~&OFv^&G &W% t?!F!V!F!VFV;Vu;FsS6(\6&\FPPFPFPF u6(\6&\vvPPF2\FV띠~\r ^&Gt^&O^&O^&G_^&O ^ &w &w`^F th^&GFv&D^ & vu#&Gv&^&g^ S^SD+~\r ^&Gt^&Gt&G^&G]U^&G u&g 0\ .\tZ^&G^ &G"&u.^ &_^F&u^&G&G&G&G&G =CAt^&G&W tuz*\FFF,\^&NF*\;u;tw^S&_^&w[&E&M ;u;u:&^&*\&G;FuF&G^&G&W^&;Wu&;GuFFFyv^Sp*\&u],\&ONFَ&Gt,\*\&NF^&6*\&;Dt ,\FN*\^&F*\&G닡,\*\&ONF&&Wv&L&O~&M&U&O&W~&M&U&O&W &U &U*\FF*\&v&F*\&&O;*\u&G^&G":u^&G.\FF0\^&NF;0\u;.\t!^&َ&;Wuv &T&;Wuu.\&u ^&Oa0\.\&ONF&&W&&F.\&&O;.\u&GF^&Gv&&Gv &D&Gv/^&O 0\ .\tv &D"^&G ;s^ &O"]U^&G t?$:u ^ &u+^ &w &w^&G ":t@P^&g ,^&O 0\ .\t^ &G t>u^&O ]UQQF NFَ&G u&|td,\^&ONF&l&O^&G^ &uU^ & u*v&D &T%^ & G& W^&G &W!^ &Gu^&!G &!W=^&O ^ &w &wi^F t^&GFv&D^&G]U0\ .\uF.\FFFFr;^&;.\t/NFN^ &W &;Tu^ &W&;TuFvFssF*\FFFrT^&6*\&L;tB,\FV^F&9Gu!F^&^&;uF*\&GFFFvFs^S^&G&g ]U0\ .\uF.\FF0\^&NF;0\u;.\uَ&W;Vt&D;F tFst^&^&.\&G;FuF&G.\&Gv&F.\&G,\^&ONFَ&O&Dt&M&G&WFs LF@v]U F*\&Gv&F*\&G.\FF0\^&NF.\;u;tLَ&w;vu:&^&&G;FuV&W.\&Gv&F.\&GFv6(\6&\WP^GNQPPPXP4F]UQ\\F&.>0_u0_ 2_F&.F2_._]U._F._~t{N\\0_F&.0_;2_u 2_0_F&.&QNQPdF6(\6&\&w&7vvF t \\4_^&&G]UQQFFV^]>~u>^6>V;u;t>Nt>Vv>Fl>Fn>~Vu3G#<tȈG#>V;u>^6>V;tD_>8F\w>>;FjuT>~Vu`>@t2>~{t+>9F4v%>)F4>~4v>FH>F[S>F:P[#>FY>FVq>>Fj>FV>FYMZ&>Ft&G>Fv>F>džO>F>F>V;t>~Yt  vy_yt t >NZOxOx>:NZwOyOx>^63>F`>FbGGG uG"<`t[>~uT uO__>[_&E2_&E4<`u%QOnWpK Y=(s >^65 $r Pt(G (:`>F~uu>F>FF~G g>F,EOnWp t Gj>Fx;GlvGl;_v_>Z&Gn>Fd&EGp>Ff3GrGt9I_tHw 8;`uG I_ t0>fV>FY&E >F,& I_ t>fV>FY&E>Fw>~vU^ "u G &n GxGyo>~i ]U^oq_]U^G AGq_뵣4`>I_tf  [u#[& [Z&>Ft&G>FvZ&G;E_t>E_E_tu >/`ta >Zu?>~Wt8>[u1>~u*>^>F;tG.S>FWo_>F~uD_>F\4`t>F\3>F8>Fz 4`tA>F|>~| u6`;u __>F|>Fl>Fp>F}>~} u3>F}>Fn>Fr>^6>V;t  u>~v>F`>;Fh>Fhtg >^>V;t>v6>~D>Fz_?G0 Auh*>F6Wu< r>^8 $r_{)>N8Q U/o& &,w  o"uOZ<G#>FV>~t>9^6t4 -u.G < v$G K -t FuG < vG K ]˲>V[u0__u0D_>F>N\t?tRst?__t]q_>v6XD_>F\>^6;G 1_G (#&&&>N0r& ;c_rk_a_>A_uD~?>N P>F ;Xuw+>NP>F;XtRPw_>^6XZg a_Ow>F,& tʋ6`Z:Tvu;uzWvG Ku3u+&&g &G w`G G!>F,&usuG u st t_G G G"_G G"ulusu\G &9jt$& &)jt&n&n&;lswG"_G &&f&r&h&tpI2u)G G"tuSu _6G #usu G (_u-__t.>~YtGxGy W G -__:wuG^W`&$;t:wt G( mG W‰W*>~Yt  _ u&__ tG K*G -:B_r G F;__G 7:B_rG (!&%u>~YuGxGyG#>FV"3G._u4__:wtwG({_tAt____G 2u-`G*:B_r*G (}__ uG -G*:B_rG FWZW#>VVG < vG K5]>^6-u-t"u-W :ukPWC_X>F?ttW :t:uBW_*7MЀuG#>FYG({_uAG({_8RO (>9V4v!>9v >>FV#W#GxGyZùG P7uW :u tP/tt u+d Z<G#>FV xS _6[WTq_U>v6G Gv>A_t>~w(>~ w>~>~ w>~w>~57\Ü7|53<u&ËG&GK_>F t1Pu_>[u_&E&&;E$&E$&K_&  ÉOuG*}_G"G"t<w_G"Xq 3Ã>I_tUV&w ]I_&>&;>r I_&&$E&U&uo>Fj&E[&E &E `&EZڡ"&E0&E.&E&EPI_&>&;>r I_X&&E&U&u>Fj&E[&E &E `&EX&EÎG  r&l =v&3&&npG&G3Ҋw&E&n&EQ>~WtZuD_>8F\r>~zt>~t>^>~;u >^>~;t>~>^6G>F]>F[>F2>FH__Db_GwG#>F:P>F[UF]`_>w_+3`6Z tR$zNuÎG &G OG 3&#u ____&>0#u&=__GbWd&>0$u&=__GfWh&& t&Ov_M_u_K_&& &>tS&0\&O[&"Ü`jjjjaÜ`jjjjaÜ>Z&E+u%3&U*}&* }|3yU.[_:>FH>>>+y >Zt>[[u}\E>^[2>F[`K>~4w>F4& ]>FV>>Vj$& D>F\>^6>F~t>F>~@r >q_tD_ Z&>Ft&G>Fv>~[u>F4>FH>F[>F:P]>>3 ;`tc(*&u >F0&u 3&AAG!&&S>^(>F&Yt- YtAH>[[r Ku>~u u<G [YuYtII>NG <#<tQXuY>$@t>>$@t>F>>>Gw>>>`t``YuA>>QOwGwXY` >>`>QV6`Ow>n>` Ow>n>Ow>n^Y>P`>︅>X2`ȸ> > u>uP`t`=t``X u덹 >uVOw>6`n^>>>><`u#>FYuH>F"S>^$[)>FZ>FYuHS&&[>>>>`>>F3t>`>^63G >~|KD>~v >Ff2/2GwXu)oG&y_cG$w_W>t>uԨu>`>>읊>~YtA+, t+OO3Q>GwX>YuuY>>><`u>F*&>I_t/w W_#>F&>&>I_t w WF_&" u:GuO8`G,_ɶ˜R>>X>>>>YtPYu,YuYt;4X >>>Yt"&&&&"&&&& >~u"Yt`>︅> >GwX>Yuu>3>>>F>^6.6bFP^& ;uS0^& <uSe^&G ^&G^S:^&w FPFPF t^&Gv&ON u.^G FƊG  [FF?vZFƋ^GW_&0~FFȴFF;FsFv^&NFFF%; [u]F#hZ;rM+‹^;Zw@Z t2~=Qɋz`F^X:Gu j\ ^&w FPFPvF ul^&Gw[&ON&WVF tK."~v8^&O;s(0‹vdwW_9^YFFUbP(Pb% RPbPRPlh;6bcPh<6bcP] LIBRARY: Init.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:51) LIBRARY: OS.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:47) LIBRARY: Clstr.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:49) COPYRIGHT (C) 1980, 1993 CONVERGENT TECHNOLOGIES, INC. ALL RIGHTS RESERVED. COPYRIGHT (C) 1980, 1993 UNISYS CORPORATION. ALL RIGHTS RESERVED. THIS SOFTWARE IS PROPRIETARY TO CONVERGENT TECHNOLOGIES, INC. AND UNISYS CORPORATION AND IS NOT TO BE REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCOR4DANCE WITH PROGRAM LICENSE OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS CORPORATION. THIS PROGRAM IS FURNISHED UNDER A LICENSE RESTRICTING ITS USE SOLELY FOR THE OPERATION OF A DESIGNATED COMPUTER FOR A PARTICULAR PURPOSE. TITLE TO AND OWNERSHIP OF THE PROGRAM, INCLUDING ITS SOURCE CODE, SHALL AT ALL TIMES REMAIN IN THE NAMES OF UNISYS CORPORATION AND CONVERGENT TECHNOLOGIES, INCORPORATED.  vClstrLfsɈCTAsm R12.3.1??SEG??SEGdatadataStrSegmemory sbInitNameSegmemoryrgpInitNameSegmemoryOEMSegOEMSegGInfoSegOEMSegUcbSegOEMSegExUcbSegOEMSegconstconstAsibOsOEMSeg oSbExchSegmemory sbExchSegmemoryHwIntDescInitSegMEMORYIrfSegMEMORY IrfStringSegMEMORYDGroupDbgGroup InitGrouphh 1h`('(P ֘h, hH hؘhԘhjhh͘H@(bH јh( c! 5" '#  saSemiLowestnPTimingnInitProcIntDisablelexchOSNamePlace nYblkLocalq EncryptionKey nInitProcHardWarejibSwapFileNumber oPRgOExUcbsbOsNameClstrLfsmBufOut cFramesMax  fInitExit~cbCrashDumpPath userNumLast bGraphicsPortnSequentialDevicesMax cbPriParNameX fTimeSlicecbSysSvcParName` nSoftwareInt pAckOutBuf5 swapFileSize ExchNetE saTempLowest endOsTablesgSequentialDcbSeg nFubnSetIntHandlerpnAvailXnMinX rgModDesc rgbGpFault exchRqTracker fAgentCache|daiLocalc cbMemParityH rgbDivideFault nAvailSmallX sDiskStatOnInitProcIntEnablen iModDescMaxvrgbCrashDumpPassword pAllocUserStructnRgInitRtcRequesth iInitRunLastu sYblkLocals nWblkLocalm ibBufLEDsPut cbBusTimeout9 paAgentStealSLForOsIsbSwapFileTryEachPswd& oExUcb irgoExchReal plaEndMemoryEventControlBlocknTerminationRqxBusWindowSizeG sgFreeTailrgSysSvcParnamea pRgSgLdtrgbCrashDumpPath 8 saEndMemorysbScratchVolumeSpec sbNlsFilePassword. prgpInitNameȞ hardwareTypesZblkk userNumKbd prgoSbInity timeSliceLb exchSpecHeap sgFreeHeadnDmaIobwPitTicksPollIntervalMaxxcbWrongClientCardSW rgiKbdTimercbRgCheckConfig| sbWsConfigFileSpecHrgSoftwareIntDescwXlatTableChksumfMulparexchSchedPocket nHardwareInt exchAgenti sUNBlocks& rgbOemSeg֐9 cbNmiAddr* rgbWrongClientCardSW nYblke rgCommLine rgbDuringDMA[ sgRgHwIntDescInitrgSetIntHandlerg sbNlsFileSpec rgCrashMsg ExchNetServer rgPriParNameY rgbNmiFault sExchStat[nTicks cbRgClusterMsg pfRebootClstrnsaGraphicsBoardiMySlot rgOsTable userNumVdm sbConfigFileSpec ssBufOutnRqNoRemoteTerminationfpRgOUcb%pStatswapFileNameInfo cbWrongClientCard nRkvsUsers sgMax? rgbNmiAddr, exchMstrAgentReceiverkvfAllowDirSlashesnIob agentPriorityh pRgoGdtLinkfAgentCacheDefaultEnable} rgpInitName rgbBufIOaddrTrgUSegCbw sbSwapFileTryFirst pRgSwappingRq nMinSmallXsXBlkWtyDevMaxnIOPermissionBitsnUcbrgInitProcIntDisablesSCHeap saSemiHighestsbHwConfigFileSpecdfSFNMxnAribk fCommIopwsType sbConfigFilePswd].rgInitProcIntEnable̞oRgUserWaitCount rgOSProcName sbVersionYgenzrgbNoClientCard cbExtDumpMsgm bUNBlkSHR cMemMapSlotsq orgPcbIdleProcessCycles nrgCommLine ibBufLEDsTake initSysDevNumtcUSegu rgbExtDumpMsgn exchPitcRcbMax_sbNlsKbdPassword wOSVersion cbDuringDMAY rgbDoubleFault nWblkaosTypesaMaxPartition pXlatTable userNumVidrgbNotPresentFault rgOSProcDescpUserXlatTable sXBlkSmall[ cbNodeName ExUcbLastConfig wMySlotBits nZblkLocalu extCntlRegAws  sarCurrent fDumpOccurred rgbDefaultInt pProcStatQ rgInitError= nPcbsbWsNLSFileSpec0cbNoClientCard rgCheckConfig} fLfsToMasterrgInitRtcRequest/rgHwIntDescInitgfEnableClusterm rgbBufLEDs sbInitRunPswdhcUSegMaxs wsUserNumLaste sbOsNameClstrsWblkc clusterConfignZblki TaskSwitchcbRgLastCrashMsg exchSched nRepollActiveg pDiskStatoRgUserReadCountrgCheckConfigPswd nXBlkSmallY rgbUtilRegi rgbBusTimeout; saTempHighest GraphicsInfonXBlkUcbRgExitFileError rgbMemParityJ nInitXnUNMaxiInitRunNoResetk iLineCurrentnOutstandingMax] pRgOExUcb)bMasterFpCpuId userExchFirst rgbPageFault fChecksumCMOSHwIDrgbOverflowFault sbOsNameStndDnFcb rgbNeed386M sYblkgnWaitXpCdt] pAckInBuf9 fRebootClstrrgLastCrashMsg sgTssIntLastbMySlotpRgChgUserNumRqfWrappedDebugger nParDescMax{rgbWrongClientCard nAsibi sbWsNlsKbdFileSpecfGraphicsBoard pMouseData= nChgUserNumRq agentParamsI nSwapFabsiInitRunspMemMapm NodeNamergExitFileError nKbdTimers nNetUsers sZblkLocalw IntTaskSwitchnParDescy iInitRunVideoisExecsStat hwIdCMOSAddr rgOSbExch  cbNeed386L cbRgInitError< rgNoWsLineQ nSwappingRq nUNBlocks sWblkLocalo NetServerData exchQuietsbSwapFileTryEach( sbSwapFileTryFirstPswd' pRgSwapMode rgDmaAddruserNumClstrLastrgsgAsibiInitRunClusterqpRgTerminationRqcbRgCheckConfigPswd rgUSegfLL mbIOPort nGdtCallGatesrgCommDmaEnablecontingencyLogcbCrashDumpPassword nTryNewMasterM iColCurrent rgbStackFault FilterProcessExch nWsAbortRqrgbBogusOpFault iInitRunDumpo cbRgCrashMsg csgPmMaxGpLibSearchPathHead nInitSmallXrgHwIntTableDescD fHighSpeedO pRgWsAbortRqrgbXBusTimeout bMasterCpCpuIdnWsUsers sMapCurrent iInitRunRkvsm cbOsNameMax userNumNetMin- sEnvironmentsgRgHardwareIntDescprgRqNoRemoteTerminationb maskiBufLED userNumNetMax/nUserNum nOSProcDescrgInitProcHardWarex rgfSrpClockOnMsgWaitnDctQsbNlsKbdFileSpecclusterTimeouta cbInitRunSegw timeSliceHb^cSgWindowableVioMaxFy* nRgMassIor rgClusterMsg nExchg rgpStatistics  sProcStatU sbOsNameSrvr/ cbUtilRegg rgbBogusTssFault hwIdCMOSChecksumAddr rgbRangeFault fMasterFpexitRunFilePrio}isgGdtCallGateFirst fProtected} mptyDevMask nGDTSlots~ pExchStatW nWaitSmallXInit8259RawCommNubISDNADInit8251 ServiceHwIdRq XBusTimeout third8259AInitStatusVideoStartRtc IntHKbdXmit GPTaskFaultInitRtcTimerDmyISRInitVpSwapFileInitUcbs ClockTestSchedRawCommNubISDNB2bellRqInitEisaConfig QuietProcess InitNlsTables mouseData rqTimeKbdCheckForDAIModuleTimerInterruptAllocMemForxLat LpInterruptInitKernelStacks trbGInfoSetKbdInitInitDwellCalibrateRawCommNubISDNB1 BootBlock rqTimeVid PageTaskFaultTerminationProcess InitComm2InitReadEisaCmos InitSpecHeapIntHKbdSysInProrgRcMax InitSysComInit8237 InitDebugNub RqExInit NmiTaskFaultSysTime KbdProcess LoadFileInit mask8259AKbdTest TraceRawInt cascade8259A RestoreRTC RawCommNubBDoubleTaskFaultInitLoadClstrLfsInitAllocUsersInitVpStructures RawCommNubABInitSem BmicInterrupt InitDynLinkDAIFromHardware InitNameHeaprgPrgLocalServiceCode RawCommNubCDAddressBootBlockStackTaskFault InitStatusLog ResumeTask RTCInterrupt InitVideoSoftwareDmaInterrupt*^ BreakRawIntInvalidTssFaultInitOSNamePlace InitDbgOsIntfCoprocessor2Error FileSystem+W ' GUU U?- ,F ͠R QZvClstr vClstrLfs vSrvr vStnd Y2-`` բ)jVIVI T TO"SN - G#˜ TT#,qO,U[ `p0 {TTT TTTmv^TTT T TTu3 `a3S TT! : 3@@  m\ff+U1U"UTTT T .0U2D4U_TaTeTgToTqTsTuTwTyT .t T 8.< `.hŢ .n\XTPLHC@= 73+' #$(,048 <@DFJPT\`dߢhۢlעpӢtϢxˢ|Ǣâ}wskgc_[WSOKGB?< 62*& "$(,048 <@DFJPT\`dޢhڢl֢pҢt΢xʢ|Ƣ¢|vrjfb^ J ; :4@@T@? C&a2&ET5 AT 8_7i  xw  k CRASH STATUS (ERCLAST CRASH STATUS (ERCCLUSTER NOT RUNNING, ERC = CANNOT LOAD EXIT RUN FILE, ERC =INITIALIZATION ERROR STATUSPrimary SysService00:Run Extended Crash Dump and reboot to regain high memory. 4A Unisys CTOS ClientCard is required, but not found. 7Unisys ClientCard required, ClusterCard is not usable. 5Incorrect switch settings on Unisys CTOS ClientCard. 4This CTOS operates only with 80386 and higher CPUs. GP faultDouble faultDivide faultINTORange faultBogus opInvalid TSSNot present faultStack faultDefault int vectorXBus timeoutNon Maskable InterruptPage fault nmi address: Bus timeout: Memory parity: (during dma)Utility register: ys]DisplayConfig.run[sys] e |1Ki){?T"c\ -a[3!aO2 lӀtŊVj#&Ϣ ~ìgiM=D `A Sys $+ p& ' ( [Sys]SwapArea00.Sys ǢA D [Sys]CrashDump.Sys E\"  [Sys] [Sys]}  X W TT!  V:V:   VNVN   VGVG z V$V$נ $ s V V , V6V6 4n V0V0< VMVM<4I4I"@Ȝ4I , V V 3A4I = V>V>DB4 V V ٠U C4 V V ٠f C4IwD4 V V ٠ ES4I 3 VV@F4I  V)V)Ϡ!G)4 V V ٠P27F  VJVJQ7 V V ֠R7 V V ֠ S@7 V V ֠Tڜ7F  : VV U7F  VEVE!W7 V V ֠F22 4ICw4IT@ 4 V V ٠eA4 V> V>wvB4 V V ٠ CZ4 V V ٠ CL4ID4 V V ٠ E4 V V@F4 V) V)!G4 V V ٠Pw7 VJ VJ\QM7 V V ֠R7 V V ֠ S7 V V1 S7FB T7 V V ֠SWq7 V V ֠Jdd֜4Iu4IwAW4 V) V)D4 VE VEi @F@4 V V ٠G4 V VQ7F SQ7 V V ֠T7F : V V  U7F  VQVQ @Vv7 V V ֠0 @Vg7FA @VU7FRW7F \@ VVcW7Ft`Ϝ V> V>aŜ V V b V V c V V d V V  eb V V@f0 VJ VJgǜ V V N=4I &4IAF4 V> V>w/P27 VJ VJ\@Q7F Jw V9V9QR7 V V ֠bSq7 V) V)sTۜ7 V V U7 VE VEf@V7 V VW7 V V ֠R 04Ik4I@4 V VA4 V) V)C`4 V9 V9 DF4 V> V>w" E4 V V ٠. @F@84 V V ٠?G)4 V VPP7 VJ VJ\aQn7FrQ7 V V ֠# R87 V V ֠$S!7 V V ֠T 7 V) V) Uw7 VQ VQN @Vʜ7 V V ֠ @V7F @V7F@V7F WL7F ) V@V@V4I-4I>7FOA 7 V> V>t`C7 V V ֠q$CU7FDf V V EҜ4 V VP7 VJ VJ\Q V@ V@T 7F @ VV Uߜ7F @ V!V!ߠ@V7F Μ VV WМ4I ; VLVLZ\F T Th[Sys]PS_V.sysJKs][Sys]InstallVdm.RunvD]siskݠ[Sys]Rkvs.Runsmڠ[Sys]ExtCrashDump.Run~usoנb XsqԠ[Sys]InstallKbd.Run6 Us[Sys]Oem1.Run9s[Sys]Oem2.Run$s)[Sys]Oem3.Run)s<[Sys]Oem4.Run<s Oys]DisplayConfig.RunOsk[Sys]SysInit.RunϠkǜs[Sys]Signon.Run ss UN6[Sys]NlsKbd.Sys[Sys]Ws###>NlsKbd.Sys\ Kbd: K M L L w SysInO E K H D w Termination 9 I D : w SchedL 3 H B , w LclFileSysN  ( D :  w 'FileSysa '  C 8 ' w /Agent+ / B 6 / w 5Init 5 ? 0 5 w :KbdInternal :  6  0: w FMassIo F F w MFsPocketڠ M M w VScsiManager V  Vܜ w bFsPeriodic b  b̜ w mMstrAgentRcv m ՠ "m w zMstrAgent6 z ˠ z w Swapper à 4 2 4 w VideoSem   w HwIdI  3 6 6 w exchSchedPocket   w exchQuiet   w exchRqTrackerV  $v w exchSpecHeapϠ  &f w~ ExchOSNamePlace p (W w{ exchPit h *E w  V2V2 SyncKbdProcess̠ Y ,; wKbdProcess] N V V  TimerF H *X VRVR} SyncFileSystem/ResourceMgr > .* w3ResourceMgr͠ < 7 X V*V*͠ SyncSysInProl  0 2  w@xSysInPro 3 D V%V%נ SyncTerminationProcess  2 8 8 wMk&TerminationProcess& Q : VV 5SyncServiceHwIdRqj 5 1 : :5ޜ wZ^9ServiceHwIdRq9  ^0 VV GSyncQuietProcessr G 0 < <Gʜ wgQGQuietProcessG  k VV XSyncSchedh X  / > >X wtD TSchedT ZNull^Zx@ VV|< VKVK8 V5V54 VV0 VV, VV( VV$ V-V-Ǡ VV V&V&ՠ V/V/à VV VV VV VV V,V,ɠ VV V V  VBVB ĞV8V8TTa̞ V V InitDwellCalibrate S TTО V<V<InitAllocUsers< TTԞ VOVO"InitOSNamePlace{") TT؞ VPVP2 InitDbgOsIntf 2 TTܞܜ V'V'Ӡ@InitReadEisaCmosӠ@ TT؜ VFVFQAddressBootBlockQ TTԜ V;V;bInitLoadClstrLfsbٜ TTМ V(V(Ѡs InitSpecHeap/sĜ TT̜ V.V. InitDebugNub TTȜ V3V3 LoadFileInit$ TTĜ VV InitNlsTables( TT VVInitEisaConfig', TT V?V? InitSem٠0l TT VCVC InitNameHeap4` TT VAVA InitDynLink(8O TT VVInitVpSwapFile<? TT  V=V=InitVpStructures@, TT VVInitKernelStacksD TT VHVH  InitStatusLogH  TT VVInitStatusVideoL TT0[Sys]Nls.Sys[Sys]Ws###>Nls.Sys [Sys]Config.Sys H ] ^ ٠H[Sys]Ws###>Config.Sys[Sys]HW###>Config.Sys/`123458`9`<=>?D`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_`/@< VV=?/ VVK?! V#V#۠YS VVo@~ g#FJ ` `~,XtvSrvrQCTAsm R12.3.18??SEG??SEGdatadataStrSegmemory sbInitNameSegmemoryrgpInitNameSegmemoryOEMSegOEMSegGInfoSegOEMSegUcbSegOEMSegExUcbSegOEMSegconstconstAsibOsOEMSegStatsSegOemSegCdtSegCdt oSbExchSegmemory sbExchSegmemoryHwIntDescInitSegMEMORYIrfSegMEMORY IrfStringSegMEMORYDGroupDbgGroup InitGrouphhh|r(( h, hH hؘhԘhzXh͘H6h@HH([H  ɘh!"(#$[% 1&' saSemiLowestnPTimingnInitProcIntDisableexchOSNamePlace nYblkLocalB EncryptionKeynInitProcHardWareibSwapFileNumber0 oPRgOExUcbsbOsNameClstrLfsnMinYmBufOutn cFramesMaxj fInitExitcbCrashDumpPath userNumLastL bGraphicsPort nIobUsedH:nSequentialDevicesMaxp cbPriParName fTimeSliceҐ nExchIncbSysSvcParName nSoftwareInt pAckOutBuf swapFileSizehExchNet saTempLowest endOsTableԦsgSequentialDcbSegrnFubnSetIntHandler  nLocWrite =nAvailXnMinX rgModDesc rgbGpFault exchRqTracker fAgentCachedaiLocal nAvailSmallX cbMemParity rgbDivideFault sDiskStatnInitProcIntEnable iModDescMaxrgbCrashDumpPassword pAllocUserStruct,nRgInitRtcRequest iInitRunLast nDevMountedv sYblkLocalD nWblkLocal> ibBufLEDsPut cbBusTimeout paAgentStealSLForOs nAvailWLocalsbSwapFileTryEachPswdtoExUcb irgoExchReal plaEndMemory nAvailZLocalEventControlBlockGnTerminationRqJxBusWindowSize sgFreeTailrgSysSvcParname pRgSgLdt srgbTypeTablergbCrashDumpPath saEndMemorysbScratchVolumeSpec[sbNlsFilePasswordb prgpInitName hardwareTypesZblk< userNumKbd prgoSbInit timeSliceLb exchSpecHeap sgFreeHeadnDmaIobexchFilterPocket, wPitTicksPollIntervalMaxcbWrongClientCardSWt rgiKbdTimer cbRgCheckConfig sbWsConfigFileSpecި nInitYLocalnAvailZrgSoftwareIntDescRwXlatTableChksumfMulparexchSchedPocket nHardwareInt exchAgent sUNBlocksU rgbOemSeg֐7nYblk6 cbNmiAddr rgbWrongClientCardSWu cFreeFab rgCommLine rgbDuringDMA sgRgHwIntDescInitrgSetIntHandler sbNlsFileSpecP rgCrashMsg6 ExchNetServerX rgPriParName sExchStat rgbNmiFaultf nTicksicbRgClusterMsg^ pfRebootClstrsaGraphicsBoardiMySlot rgOsTablec rgbXpCharŐ userNumVdm6 s bConfigFileSpecssBufOutpnRqNoRemoteTerminationpStatxpRgOUcb}swapFileNameInfolcbWrongClientCard< nRkvsUsers` sgMax? rgbNmiAddr exchMstrAgentReceivernAvailWvfAllowDirSlashesnIob agentPriority pRgoGdtLinkfAgentCacheDefaultEnablez rgpInitName rgbBufIOaddrrgUSegCbsbSwapFileTryFirstnMinFABnInitW nMinSmallX pRgSwappingRqRsXBlktyDevMax#nIOPermissionBitsnUcbrgInitProcIntDisablesSCHeap saSemiHighestsbHwConfigFileSpec nWaitWLocalfSFNMnAribfCommIopwsType sbConfigFilePswdmFrgInitProcIntEnableoRgUserWaitCountrgbDefaultConfigFile| rgOSProcName sbVersionYgenrgbNoClientCard cbExtDumpMsg bUNBlkSHR nInitWLocal cMemMapSlots pMasterFPCdtorgPcbIdleProcessCycles nrgCommLine ibBufLEDsTake initSysDevNum cUSeg rgbExtDumpMsg exchPit  nRemWrite0~"cRcbMaxsbNlsKbdPassword nRemRead$fForceSlotBits$ wOSVersionnWblk2 cbDuringDMA rgbDoubleFault osTypesaMaxPartitioncbDefaultConfigFileۨ pXlatTable userNumVidrgbNotPresentFault( rgOSProcDesc֦pUserXlatTable sXBlkSmall cbNodeNameZ ExUcbLast Config wMySlotBitsnInitZ nZblkLocalF extCntlRegAwsk sarCurrent fDumpOccurred pProcStat rgbDefaultIntF rgInitError nPcbsbWsNLSFileSpecdcbNoClientCard rgCheckConfig fLfsToMasterMask186. rgInitRtcRequestũrgHwIntDescIniteQfEnableCluster rgbBufLEDsr sbInitRunPswdcUSegMax wsUserNumLast rgbTypeTableS sbOsNameClstrsWblk4 clusterConfig oFixupFreelnZblk: TaskSwitch pDiskStatcbRgLastCrashMsgG exchSched nRepollActiveoRgUserReadCountrgCheckConfigPswd nXBlkSmall rgbUtilReg rgbBusTimeout saTempHighest GraphicsInfonXBlksBroadcastHeapJ cbRgExitFileErrory nInitX rgbMemParity  nLocSeeksnUNMax iInitRunNoReset iLineCurrentnOutstandingMax pRgOExUcbbMasterFpCpuId userExchFirsts rgbPageFault} fChecksumCMOSHwID7rgbOverflowFault nWaitZnMinW sbOsNameStndDnFcbsYblk8 rgbNeed386 nWaitXpCdt% pAckInBuf fRebootClstr4rgLastCrashMsgH sgTssIntLastbMySlotnWaitYpRgChgUserNumRq@nWaitWfWrappedDebugger" nParDescMaxrgbWrongClientCard= nAsibsbWsNlsKbdFileSpecfGraphicsBoard pMouseData nChgUserNumRqD agentParams nSwapFabsiInitRunpMemMapNodeName[ maxDevMountedtrgExitFileErrorz nKbdTimers  nNetUsersP sZblkLocalH IntTaskSwitch nMinYLocalnParDesc iInitRunVideosStatsExec hwIdCMOSAddr5 rgOSbExch_ sWblkLocal@ cbNeed386 cbRgInitError rgNoWsLine nSwappingRqV nUNBlocks NetServerData: exchQuietsbSwapFileTryEachvsbSwapFileTryFirstPswdu pRgSwapMode fCheckMem nInitY rgDmaAddrFuserNumClstrLastNrgsgAsibiInitRunClusterpRgTerminationRqFcbRgCheckConfigPswd rgUSegfLL mbIOPort nWaitYLocal nGdtCallGates nAvailYLocalrgCommDmaEnableF oFixupHeadn nMinWLocalcontingencyLoglcbCrashDumpPassword nTryNewMaster iColCurrent rgbStackFault: FilterProcessExch nWsAbortRq>rgbBogusOpFault iInitRunDump cbRgCrashMsg5 csgPmMaxG됧pLibSearchPathHeadNnMinZ nInitSmallXwMasterFPCdtBasergHwIntTableDesc fHighSpeed pRgWsAbortRq:rgbXBusTimeoutY bMasterCpCpuIdnWsUsers2̐ nLocReadE sMapCurrent iInitRunRkvs cbOsNameMax userNumNetMin nWaitZLocal sEnvironmentsgRgHardwareIntDescprgRqNoRemoteTermination fCheckEcc maskiBufLED userNumNetMaxnUserNum0 nOSProcDesc8rgInitProcHardWareX rgfSrpClocknMsgWaitnRcb0 nDctsbNlsKbdFileSpec nInitZLocalnAvailYclusterTimeout cbInitRunSeg nMinZLocal timeSliceHbcSgWindowableVioMaxFy* nRgMassIo rgClusterMsg_ nExchgĐ rgpStatistics  sProcStat sbOsNameSrvr/ nRemSeeks< cbUtilReg rgbBogusTssFault hwIdCMOSChecksumAddr6 rgbRangeFault fMasterFpexitRunFilePrioisgGdtCallGateFirst fProtected nWaitSmallX pExchStat mptyDevMask% nGDTSlotsInit8259RawCommNubISDNADInit8251 ServiceHwIdRq Init82380 XBusTimeoutInitPIT third8259AInitStatusVideoStartRTC IntHKbdXmitIccInit GPTaskFaultInitRtc InitConfigTimerDmyISRLoadFsNotMasterInitVpSwapFileInitUcbs ClockTestSchedRawCommNubISDNB2bellRqInitEisaConfigInitRouteTablesWaitForSrpCpuSync QuietProcess InitNlsTables LoadFsMaster mouseData rqTimeKbdCheckForDAIModuleTimerInterruptAllocMemForxLatInitMapHardware LpInterruptInitKernelStacks trbGInfoSetInitEnableBmicKbdInitInitDwellCalibrateInitIccToMasterRawCommNubISDNB1 ParseBootList BootBlock rqTimeVid PageTaskFaultTerminationProcess LoadAgentInitRcbSegment InitComm2InitReadEisaCmos InitSpecHeapIntHKbdSetDateTimeMasterSysInProrgRcMax InitSysComInit8237 InitDebugNubRqExInit NmiTaskFaultSysTime KbdProcessInitBroadcastHeap LoadFileInit mask8259A CheckHostCPUKbdTest TraceRawIntLclFsFilterProcess cascade8259AInitIccSegment RestoreRTC RawCommNubBDoubleTaskFault InitResetBmicClockProInitAllocUsers ParseIccDataEnableMountTableInitVpStructures RawCommNubABInitSem BmicInterrupt InitDynLink InitNameHeap DoExtDumprgPrgLocalServiceCodeLoadConfig_Sys RawCommNubCDAddressBootBlockStackTaskFault CheckScrVol InitStatusLog ResumeTask RTCInterrupt InitVideoSoftwareDmaInterrupt BreakRawIntInvalidTssFaultInitOSNamePlace InitDbgOsIntfCoprocessor2Error FileSystemW ' 0UU U?-[,FMR QZvClstr vClstrLfs vSrvr vStnd Y2- `Q@``p0 _VaVaw TTT T TTu3,`a< TT![ 㠋g @`@ 4$f:U@U.UTTT T .0U2Z4U_TaTeTgToTqTsTuTwTyT M1.D h۠.p .h J..FJNRVZ^bdhڢn֢r΢zʢ~Ƣ¢~zvrnjfc`ZVNJFA= 951-)%""$(.2 : >BFJNRVZ^bdߢh٢nբr͢zɢ~Ţ}yuqmieb_YUMIE@< 840,($"!$(.2 :> BF I ݠiݢlנnr@@T?  3&2%& ޜT3 AIT 8 _٠``  L  5 CRASH STATUS (ERCLAST CRASH STATUS (ERCCLUSTER NOT RUNNING, ERC = CANNOT LOAD EXIT RUN FILE, ERC =INITIALIZATION ERROR STATUSPrimary SysService00:Run Extended Crash Dump and reboot to regain high memory. 4A Unisys CTOS ClientCard is required, but not found. 7Unisys ClientCard required, ClusterCard is not usable. 5Incorrect switch settings on Unisys CTOS ClientCard. 4This CTOS operates only with 80386 and higher CPUs. GP faultDouble faultDivide faultINTORange faultBogus opInvalid TSSNot present faultStack faultDefault int vectorXBus timeoutNon Maskable InterruptPage fault nmi address: Bus timeout: Memory parity: (during dma)Utility register: ys]DisplayConfig.run [sys]F ) 6  $ % T T   !"#??EEEEEEW) @@L T \ d l t |    $ , 4 < D L T \ d l t |  $,4<DLT\dlt| $,4<DLT\dd|w+3;CKS[cks{ăċēěģīijĻ #+3;CKS[cks{ŃŋœśţūųŻ #+3;CKS[cks{ƃƋƓƛƣƫƳƻ #+3;COTQTd|^ ```Y j T T  9 - ! $ 0  < H T ^^ T T  ^! [ ߜ T T  ^  < 8 @ *  ( 0 `Ѣ <<Ǡ xq    e|1Ki){?T"c\ -a[3!aO2 lӀtŊVj#&Ϣ ~ìgiM=D=`[Sys_ Ӡ+hptuv[Sys]SwapArea00.Sys ǢDh[Sys]CrashDump.SysE "0A [Sys]N [Sys] AN2 TT! RG VMVM Z = VfVfS b 3 V^V^c j) V0V0 r " V V  zF VGVG  V?V?2 VeVeU:D9D9"@ƜD9 , VV3AD9 = VTVTyDBD V VU CD V Vf C}D9wDD V V EQD9 1 V"V"ݠ@FD9  V7V7!G'D V VP0I4  VbVb]Q~I V VRI V V S@I V VT؜I4  8 V%V%נ UI4  V\V\i!WI V V2l2D9CuD9T@ D V VeAD VT VT;vBD V V CXD V V CJD9DD V V ED V" V"@FߜD V7 V7u!GD V VPuI Vb VbQKI V VRI V V SI V% V%1 SI4B TI V VSWoI V Vd5dԜD9uD9uAUD V7 V7uDD V\ V\+ @F@D V VGD V% V%QI4 SOI V VTI4 8 V V  UI4  ViViO @VtI V V0 @VeI4A @VSI4RWI4 \@ VVcWI4t`͜ VT VTwaÜ V Vb V Vc V Vd V V e` V" V"۠@f. Vb Vb[gŜ V V;D9 $D9ADD VT VT;/P0I Vb Vb@QI4 Ju VLVLQRI V VbSoI V7 V7psTٜI V" V" UI V\ V\&@VI V% V%WI V V ߠD9iD9@D V" V"AD V7 V7uC^D VL VLK DDD VT VT;" ED V V. @F@6D V V?G'D V% V%PPI Vb VbaQlI4rQI V V#R6I V V$SI V VT I V7 V7p UuI Vi Vi  @VȜI V V @VI4 @VI4@VI4 WJI4 ' VVVVujD9-D9>I4OA I VT VT6`CI V Vq$CSI4Dd V VEМD V" V"PI Vb VbQ VV VVsTI4 @ VV UݜI4 @ V,V,ɠ@VI4 ̜ VV WΜD9 9 VdVdY T T[Sys]PS_V.sysJޠIq][Sys]InstallVdm.RunvD]qq[Sys]Rkvs.Runq[Sys]ExtCrashDump.Run|sq` Vq[Sys]InstallKbd.Run4 Sq[Sys]Oem1.Run7q[Sys]Oem2.Run"q)[Sys]Oem3.Run) q<[Sys]Oem4.Run<q Oys]DisplayConfig.RunOqk[Sys]SysInit.Run͠kŜq[Sys]Signon.Runq XUJ6[Sys]NlsKbd.Sys[Sys]Ws###>NlsKbd.SysdԔѠԦޠKbd8IKJJu SysInMCIFBu Termination 7G B 8u SchedJ1F @ *uLclFileSysL & B 8u 'FileSys_' A6'u /Agent)/ @4/u 5Init5= .5u:KbdInternal: 4 0:u FMassIoFFu MFsPocketؠMMuVScsiManagerV VڜubFsPeriodicb  bʜumFilterProsˠm ՠmלuxMstrAgentRcvx Ƞ"xuMstrAgent) u SwapperԠ224u VideoSemu HwId<166vu, exchFilterPocket#u*exchSchedPocket$ru'exchQuiet͠ }&`u$exchRqTracker8 o(Tu!exchSpecHeap b*DuExchOSNamePlace R,5u  exchPituJ.#u ֦ VAVASyncKbdProcess:2uߦѠKbdProcess] N  VOVOSyncClockPros -088uĠ ClockPro' E VV Timer=?  VVSyncQuietProcess/::uQuietProcessJ 2  w VV0SyncSched0 .<<0ߜu 'SchedD', ۜ V1V1:SyncTerminationProcess:->>:Ӝu -TerminationProcess- $ VHVHQSyncLclFsFilterProcess.Q ,@ @Qu-@LclFsFilterProcess@ 1X! VjVjMhSyncFileSystem/ResourceMgrhɠ!+B Bhu:uSResourceMgrS > "? V9V9SyncSysInPro "*DDuGh_SysInProɠ_ K #1 VVSyncServiceHwIdRq #)FFuuT[ VEVEhServiceHwIdRqh vNullBvޠXW VNVN\S VV`O VVdK VcVc[hG VFVFlC VVp? VVt; V!V!ߠx7 V<V<|3 VV/ V4V4+ V V ' V>V># V)V)Ϡ VV VV V;V; V#V#۠ V$V$٠ VV VV V V  V]V]g VKVKTT; V*V*͠InitDwellCalibrate S TT VPVPInitAllocUsers< TTħ VgVgS"InitOSNamePlace{") TTȧ VhVhQ2 InitDbgOsIntf 2 TŢ VV@ LoadFsMasterZ@ TTЧߜ V[V[kMLoadConfig_SyszM TTԧۜ VQVQ\ ParseIccData_\ߜ TTاל VJVJiInitIccSegment\iΜ TTܧӜ V3V3xInitRcbSegmentE x TTϜ V(V(ѠInitEnableBmic^$ TT˜ V+V+ˠInitIccToMasterѠ( TTǜ VVLoadFsNotMaster, TTÜ V5V5InitReadEisaCmos]0m TT VV InitConfig4X TT VBVBInitBroadcastHeap8I TT VV InitNlsTables=<3 TT V=V= InitDebugNub@! TT VCVC LoadFileInitD TT V`V`a  InitStatusLogH  TT VVInitVpSwapFileL TT VSVS{)InitVpStructuresoP)ٜ TT V-V-Ǡ: ParseBootListנT:Ĝ TT VYVYoH DoExtDumpXH TT V6V6R InitSpecHeapO\R TT VV_WaitForSrpCpuSync`_ TT VVqInitRouteTablesɠdq} TT$ V8V8SetDateTimeMasterhi TT( V_V_c CheckScrVolvlS TT, VRVR}EnableMountTableUpC TT0~ V2V2 LoadAgent%t. TT4z V V StartRTCx TT8v VVInitEisaConfig | TT<r VUVUw InitSem TT@n VXVXq InitNameHeapѠ TTDj VWVWs InitDynLink  TTHf V&V&ՠInitKernelStacksӜ TTLb V V InitStatusVideo$ TTP[Sys]Nls.Sys[Sys]Ws###>Nls.Sys:Boot:(Processor=CP00,OS=[sys]rSrpCp.run) :Boot:(Processor=GP00,OS=[sys]pSrpGp.img) ^ [Sys]Config.Sys %H֠ m n ɠި[Sys]Ws###>Config.Sys[Sys]HW###>Config.Sys/`123458`9`<=>?D`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_`hũ@ VVө? V V ? V/V/à V'V'Ӡ8 SdYs$ %#FJ`@> tvClstrCTAsm R12.3.1??SEG??SEGdatadataStrSegmemory sbInitNameSegmemoryrgpInitNameSegmemoryOEMSegOEMSegGInfoSegOEMSegUcbSegOEMSegExUcbSegOEMSegconstconstAsibOsOEMSeg oSbExchSegmemory sbExchSegmemoryHwIntDescInitSegMEMORYIrfSegMEMORY IrfStringSegMEMORYDGroupDbgGroup InitGrouphhh`(9(X Θh, hH hؘhԘhjhh͘H8(;ʘHh( c! 5" '#  saSemiLowestnPTimingnInitProcIntDisableexchOSNamePlace nYblkLocalq EncryptionKey nInitProcHardWareibSwapFileNumber oPRgOExUcbsbOsNameClstrLfsmBufOut cFramesMax  fInitExit~cbCrashDumpPath userNumLast bGraphicsPortnSequentialDevicesMax cbPriParNameX fTimeSlicecbSysSvcParName` nSoftwareInt pAckOutBuf5 swapFileSize ExchNetE saTempLowest endOsTablesgSequentialDcbSeg nFubnSetIntHandlernAvailXnMinX rgModDesc rgbGpFault exchRqTracker fAgentCache|daiLocalc cbMemParityH rgbDivideFault nAvailSmallX sDiskStatOnInitProcIntEnable iModDescMaxrgbCrashDumpPassword pAllocUserStructnRgInitRtcRequest iInitRunLastu sYblkLocals nWblkLocalm ibBufLEDsPut cbBusTimeout9 paAgentStealSLForOsIsbSwapFileTryEachPswd& oExUcb irgoExchReal plaEndMemoryEventControlBlocknTerminationRqxBusWindowSizeG sgFreeTailrgSysSvcParnamea pRgSgLdtrgbCrashDumpPath ? saEndMemorysbScratchVolumeSpec sbNlsFilePassword prgpInitNameD hardwareTypesZblkk userNumKbd prgoSbInity timeSliceLb exchSpecHeap sgFreeHeadnDmaIobwPitTicksPollIntervalMaxxcbWrongClientCardSW rgiKbdTimercbRgCheckConfig| sbWsConfigFileSpec̛rgSoftwareIntDescwXlatTableChksumfMulparexchSchedPocket nHardwareInt exchAgenti sUNBlocks rgbOemSeg֐9 cbNmiAddr* rgbWrongClientCardSW nYblke rgCommLine rgbDuringDMA[ sgRgHwIntDescInitrgSetIntHandler sbNlsFileSpec rgCrashMsg ExchNetServer rgPriParNameY rgbNmiFault sExchStat[nTicks cbRgClusterMsg pfRebootClstrnsaGraphicsBoardiMySlot rgOsTable userNumVdm sbConfigFileSpec ssBufOutnRqNoRemoteTerminationfpRgOUcb%pStatswapFileNameInfo cbWrongClientCard nRkvsUsers sgMax? rgbNmiAddr, exchMstrAgentReceiverkvfAllowDirSlashesnIob agentPriorityh pRgoGdtLinkfAgentCacheDefaultEnab le} rgpInitName rgbBufIOaddrTrgUSegCbw sbSwapFileTryFirst pRgSwappingRq nMinSmallXsXBlkWtyDevMaxnIOPermissionBitsnUcbrgInitProcIntDisablesSCHeap saSemiHighestsbHwConfigFileSpecfSFNMnAribk fCommIopwsType sbConfigFilePswd].rgInitProcIntEnableHoRgUserWaitCount rgOSProcName sbVersionYgenrgbNoClientCard cbExtDumpMsgm bUNBlkSHR cMemMapSlotsq orgPcbIdleProcessCycles nrgCommLine ibBufLEDsTake initSysDevNumcUSegu rgbExtDumpMsgn exchPitcRcbMax_sbNlsKbdPassword wOSVersion cbDuringDMAY rgbDoubleFault nWblkaosTypesaMaxPartition pXlatTable userNumVidrgbNotPresentFault rgOSProcDescpUserXlatTable sXBlkSmall[ cbNodeName ExUcbLastConfig wMySlotBits nZblkLocalu extCntlRegAws  sarCurrent fDumpOccurred rgbDefaultInt pProcStatQ rgInitError= nPcbsbWsNLSFileSpeccbNoClientCard rgCheckConfig} fLfsToMasterrgInitRtcRequestirgHwIntDescInitgfEnableClusterm rgbBufLEDs sbInitRunPswdhcUSegMaxs wsUserNumLaste sbOsNameClstrsWblkc clusterConfignZblki TaskSwitchcbRgLastCrashMsg exchSched nRepollActiveg pDiskStatoRgUserReadCountrgCheckConfigPswd nXBlkSmallY rgbUtilRegi rgbBusTimeout; saTempHighest GraphicsInfonXBlkUcbRgExitFileError rgbMemParityJ nInitXnUNMaxiInitRunNoResetk iLineCurrentnOutstandingMax] pRgOExUcb)bMasterFpCpuId userExchFirst rgbPageFault fChecksumCMOSHwIDrgbOverflowFault sbOsNameStndDnFcb rgbNeed386M sYblkgnWaitXpCdt] pAckInBuf9 fRebootClstrrgLastCrashMsg sgTssIntLastbMySlotpRgChgUserNumRqfWrappedDebugger nParDescMax{rgbWrongClientCard nAsibi sbWsNlsKbdFileSpecfGraphicsBoard pMouseData= nChgUserNumRq agentParamsI nSwapFabsiInitRunspMemMapm NodeNamergExitFileError nKbdTimers nNetUsers sZblkLocalw IntTaskSwitchnParDescy iInitRunVideoisExecsStat hwIdCMOSAddr rgOSbExch  cbNeed386L cbRgInitError< rgNoWsLineQ nSwappingRq nUNBlocks sWblkLocalo NetServerData exchQuietsbSwapFileTryEach( sbSwapFileTryFirstPswd' pRgSwapMode rgDmaAddruserNumClstrLastrgsgAsibiInitRunClusterqpRgTerminationRqcbRgCheckConfigPswd rgUSegfLL mbIOPort nGdtCallGatesrgCommDmaEnablecontingencyLogcbCrashDumpPassword nTryNewMasterM iColCurrent rgbStackFault FilterProcessExch nWsAbortRqrgbBogusOpFault iInitRunDumpo cbRgCrashMsg csgPmMaxGpLibSearchPathHead nInitSmallXrgHwIntTableDescD fHighSpeedO pRgWsAbortRqrgbXBusTimeout bMasterCpCpuIdnWsUsers sMapCurrent iInitRunRkvsm cbOsNameMax userNumNetMin- sEnvironmentsgRgHardwareIntDescprgRqNoRemoteTerminationb maskiBufLED userNumNetMax/nUserNum nOSProcDescrgInitProcHardWare rgfSrpClockOnMsgWaitnDctQsbNlsKbdFileSpecclusterTimeouta cbInitRunSegw timeSliceHbcSgWindowableVioMaxFy* nRgMassIo rgClusterMsg nExchgA rgpStatistics  sProcStatU sbOsNameSrvr/ cbUtilRegg rgbBogusTssFault hwIdCMOSChecksumAddr rgbRangeFault fMasterFpexitRunFilePrio}isgGdtCallGateFirst fProtected} mptyDevMask nGDTSlots~ pExchStatW nWaitSmallXInit8259RawCommNubISDNADInit8251 ServiceHwIdRq XBusTimeout third8259AInitStatusVideoStartRtc IntHKbdXmit GPTaskFaultInitRtc InitConfigTimerDmyISR SysDeviceInitInitVpSwapFileInitUcbs ClockTestSchedRawCommNubISDNB2bellRqInitEisaConfig QuietProcess InitNlsTables mouseData rqTimeKbdCheckForDAIModuleTimerInterruptAllocMemForxLat LpInterruptInitKernelStacks trbGInfoSetKbdInitInitDwellCalibrateRawCommNubISDNB1 BootBlock rqTimeVid PageTaskFaultTerminationProcess LoadAgent InitComm2InitReadEisaCmos InitSpecHeapIntHKbdSysInProrgRcMax InitSysComInit8237 InitDebugNubRqExInit NmiTaskFaultSysTime KbdProcess LoadFileInit mask8259AKbdTest TraceRawInt cascade8259A RestoreRTC RawCommNubBDoubleTaskFaultInitAllocUsersInitVpStructures RawCommNubABInitSem BmicInterrupt InitDynLinkDAIFromHardware InitNameHeaprgPrgLocalServiceCode RawCommNubCDAddressBootBlockStackTaskFault InitStatusLog ResumeTask RTCInterrupt InitVideotSoftwareDmaInterrupt BreakRawIntInvalidTssFaultInitOSNamePlace InitDbgOsIntfCoprocessor2Error FileSystemנW ' GUU U?-#,FݠR QZvClstr vClstrLfs vSrvr vStnd Y2-HH%)jVKVK T TK"SN - G#˜ TT#,qO,U[`p0 TTT TTTmv^TTT T TTu3`a TT! :@0  m\f,f.U4U$UTTT T .0U2F4U_TaTeTgToTqTsTuTwTyT .t T 8.< `.hŢ .n\XTPLHC@= 73+' #$(,048 <@DFJPT\`dߢhۢlעpӢtϢxˢ|Ǣâ}wskgc_[WSOKGB?< 62*& "$(,048 <@DFJPT\`dޢhڢl֢pҢt΢xʢ|Ƣ¢|vrjfb^ J ; :4@@T@?S&a2&FT5 AT 8_7i  w  k CRASH STATUS (ERCLAST CRASH STATUS (ERCCLUSTER NOT RUNNING, ERC = CANNOT LOAD EXIT RUN FILE, ERC =INITIALIZATION ERROR STATUSPrimary SysService00:Run Extended Crash Dump and reboot to regain high memory. 4A Unisys CTOS ClientCard is required, but not found. 7Unisys ClientCard required, ClusterCard is not usable. 5Incorrect switch settings on Unisys CTOS ClientCard. 4This CTOS operates only with 80386 and higher CPUs. GP faultDouble faultDivide faultINTORange faultBogus opInvalid TSSNot present faultStack faultDefault int vectorXBus timeoutNon Maskable InterruptPage fault nmi address: Bus tim eout: Memory parity: (during dma)Utility register: ys]DisplayConfig.run[sys] e |1Ki){?T"c\ -a[3!aO2 lӀtŊVj#&Ϣ ~ìgiM=D `A Sys $+ p& ' ( [Sys]SwapArea00.Sys ǢA D [Sys]CrashDump.Sys E\"  [Sys] [Sys]}  X W TT!  V=V=   VPVP  VIVI z V&V&Ӡ $ s V V , V9V9 4n V3V3< VOVO<7F7F"@Ȝ7F , VV3A7F = V@V@DB7 V VԠUD 7 V VԠf Eu7F pU VVw@F@7F Ü V,V,ɠ!GK7 V VԠPT:C # VLVLQ: V VѠR : V VѠT :C n VV U:C ޜ VGVGW؜: V VѠF=7F7F!@?7 V VԠ2A57 V@ V@pCB7 V VԠTD 7 V VԠe E7 V Vv@F67 V, V,!GK7 V VԠP̜: VL VLUQ: V VѠR : V VѠS : V VW: V VѠJN7F87F%w AΜ7 V, V,1D#7 VG VGbBG)7 V VSQ:Cd Sٜ: V VѠuTI:C Ü V V  U2:C 4 VSVS{W:C @c VV` V@ V@a V Vbl V VcU V Vd V V e/ V V@f VL VLg V VN00 7FA7FRA7 V@ V@pcP: VL VLUtQh:C ~D V<V<R՜: V VѠS>: V, V,T: V V Uv: VG VG_@Vќ: V VW: V VѠR N7F87F @e7 V VAΜ7 V, V,/C,7 V< VPS_V.sysJKs][Sys]InstallVdm.RunvD]siskݠ[Sys]Rkvs.Runsmڠ[Sys]ExtCrashDump.Run~usoנb XsqԠ[Sys]InstallKbd.Run6 Us[Sys]Oem1.Run9s[Sys]Oem2.Run$s)[Sys]Oem3.Run)s<[Sys]Oem4.Run<s Oys]DisplayConfig.RunOsk[Sys]SysInit.RunϠkǜs[Sys]Signon.Run ss UN6[Sys]NlsKbd.Sys[Sys]Ws###>NlsKbd.Sys؋(4 Kbd: K M L L w SysInO E K H D w Termination 9 I D : w SchedL 3 H B , w LclFileSysN  ( D :  w 'FileSysa '  C 8 ' w /Agent+ / B 6 / w 5Init 5 ? 0 5 w :KbdInternal :  6  0: w FMstrAgentRcv< F  "F w SMstrAgent] S  S w ]Swapper ] 4 2 4] w eVideoSemŠ e e w nHwIdp nܠ 3 6 6n w sexchSchedPocketנ s̠ sӜ w exchQuiet    w exchRqTracker}   w  exchSpecHeap   w ExchOSNamePlace   w exchPit  v w  V5V5 SyncKbdProcess  $j w'KbdProcess] N V V   TimerF H X VTVTy SyncFileSystem/ResourceMgr& e &Y w ResourceMgr͠ <   V-V-Ǡ SyncSysInPro X (< wSysInPro 3 I V'V'Ӡ SyncTerminationProcess; A *- wɚ&TerminationProcess& ͚ ɜ VV SyncServiceHwIdRq . , w֚9ServiceHwIdRq9  ښ VV SyncQuietProcess  .  w٠GQuietProcessG   VV 1SyncSched 1  21 w̠ TSchedT ZNull^ZȜ VVĜ VMVM V8V8 VV VV VV VV V0V0 VV V)V)Ϡ V2V2 V!V!ߠ$ VV( VV, VV0 V/V/à4 VV8 V V < VDVD @wV;V;TT[Hs V"V"ݠInitDwellCalibrate S TTLo V>V>InitAllocUsers< TTPk VQVQ"InitOSNamePlace{") TTTg VRVR}2 InitDbgOsIntf 2 TTXc V*V*͠@InitReadEisaCmosӠ@ TT\_ VHVHQAddressBootBlockQ TT`[ V(V(Ѡb LoadAgenttbٜ TTdW VVl SysDeviceInitl˜ TThS V V z InitConfigߠ z TTlO V+V+ˠ InitSpecHeap$ TTpK V1V1 InitDebugNub ( TTtG V6V6 LoadFileInit , TTxC VV InitNlsTablesu0w TT|? VVInitEisaConfig4e TT; VAVA InitSemǠ8R TT7 VEVE InitNameHeap۠<F TT3 VCVC InitDynLink@5 TT/ VVInitVpSwapFileܠD% TT+ V?V?InitVpStructuresH TT' VV InitKernelStacksΠL  TT# VJVJ InitStatusLogP  TT VV)InitStatusVideoT)՜ TT0[Sys]Nls.Sys[Sys]Ws###>Nls.Sys6 [Sys]Config.Sys H ] ^ ٠̛[Sys]Ws###>Config.Sys[Sys]HW###>Config.Sys/`123458`9`<=>?D`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_`@ VV? VVϜ? V%V%נݜӜ V V oˠ뜐#FJHHfntvStndeCTAsm R12.3.1??SEG??SEGdatadataStrSegmemory sbInitNameSegmemoryrgpInitNameSegmemoryOEMSegOEMSegGInfoSegOEMSegUcbSegOEMSegExUcbSegOEMSegconstconstAsibOsOEMSeg oSbExchSegmemory sbExchSegmemoryHwIntDescInitSegMEMORYIrfSegMEMORY IrfStringSegMEMORYDGroupDbgGroup InitGrouphh֘h`(D(\ ʘh, hH hؘhԘhjhh͘H@(bH јh( c! 5" '#  saSemiLowestnPTimingnInitProcIntDisable̛exchOSNamePlace nYblkLocalq EncryptionKey nInitProcHardWareʛibSwapFileNumber oPRgOExUcbsbOsNameClstrLfsmBufOut cFramesMax  fInitExitcbCrashDumpPath userNumLast bGraphicsPortnSequentialDevicesMax cbPriParNameX fTimeSlicecbSysSvcParName` nSoftwareInt pAckOutBuf5 swapFileSize ExchNetE saTempLowest endOsTablebsgSequentialDcbSeg nFubnSetIntHandlerЛnAvailXnMinX rgModDesc rgbGpFault exchRqTracker fAgentCache|daiLocalc cbMemParityH rgbDivideFault nAvailSmallX sDiskStatOnInitProcIntEnableΛ iModDescMax֛rgbCrashDumpPassword pAllocUserStructnRgInitRtcRequestț iInitRunLasty sYblkLocals nWblkLocalm ibBufLEDsPut cbBusTimeout9 paAgentStealSLForOsIsbSwapFileTryEachPswd* oExUcb irgoExchReal plaEndMemoryEventControlBlocknTerminationRqxBusWindowSizeG sgFreeTailrgSysSvcParnamea pRgSgLdtrgbCrashDumpPath T saEndMemorysbScratchVolumeSpec sbNlsFilePassword prgpInitName hardwareTypesZblkk userNumKbd prgoSbInit} timeSliceLb exchSpecHeap sgFreeHeadnDmaIobwPitTicksPollIntervalMaxxcbWrongClientCardSW rgiKbdTimercbRgCheckConfig| sbWsConfigFileSpecrgSoftwareIntDescwXlatTableChksumfMulparexchSchedPocket nHardwareInt exchAgenti sUNBlocks rgbOemSeg֐9 cbNmiAddr* rgbWrongClientCardSW nYblke rgCommLine rgbDuringDMA[ sgRgHwIntDescInitrgSetIntHandlerǛ sbNlsFileSpec| rgCrashMsg ExchNetServer rgPriParNameY rgbNmiFault sExchStat[nTicks cbRgClusterMsg pfRebootClstrnsaGraphicsBoardiMySlot rgOsTable userNumVdmА sbConfigFileSpec ssBufOutnRqNoRemoteTerminationjpRgOUcb%pStatswapFileNameInfo" cbWrongClientCard nRkvsUsers sgMax? rgbNmiAddr, exchMstrAgentReceiverkvfAllowDirSlashesnIobpSgMyIcc agentPriorityh pRgoGdtLinkfAgentCacheDefaultEnable}א rgpInitName rgbBufIOaddrTrgUSegCbw sbSwapFileTryFirst pRgSwappingRq nMinSmallXsXBlkWtyDevMaxnIOPermissionBitsnUcbrgInitProcIntDisablesSCHeap saSemiHighestsbHwConfigFileSpecĚfSFNM؛nAribk fCommIopwsType  sbConfigFilePswd].rgInitProcIntEnable oRgUserWaitCount̐ rgOSProcName sbVersionYgenڛrgbNoClientCard cbExtDumpMsgm bUNBlkSHR cMemMapSlotsq orgPcbIdleProcessCycles nrgCommLine ibBufLEDsTake initSysDevNumԛcUSegu rgbExtDumpMsgn exchPitcRcbMax_sbNlsKbdPassword wOSVersion cbDuringDMAY rgbDoubleFault nWblkaosTypesaMaxPartition pXlatTable userNumVidrgbNotPresentFault rgOSProcDescdpUserXlatTable sXBlkSmall[ cbNodeName ExUcbLastConfig wMySlotBits nZblkLocalu extCntlRegAws  sarCurrent fDumpOccurred rgbDefaultInt pProcStatQ rgInitError= nPcbsbWsNLSFileSpeccbNoClientCard rgCheckConfig} fLfsToMasterrgInitRtcRequestrgHwIntDescInitgfEnableClusterm rgbBufLEDs sbInitRunPswdlcUSegMaxs wsUserNumLaste sbOsNameClstrsWblkc clusterConfignZblki TaskSwitchcbRgLastCrashMsg exchSched nRepollActiveg pDiskStatoRgUserReadCountrgCheckConfigPswd nXBlkSmallY rgbUtilRegi rgbBusTimeout; saTempHighest GraphicsInfonXBlkU sgMyShadow cbRgExitFileError rgbMemParityJ nInitXnUNMaxiInitRunNoReseto iLineCurrentnOutstandingMax] pRgOExUcb)bMasterFpCpuId userExchFirst rgbPageFault fChecksumCMOSHwIDrgbOverflowFault sbOsNameStndDnFcb rgbNeed386M sYblkgnWaitXpCdt] pAckInBuf9 fRebootClstrrgLastCrashMsg sgTssIntLastbMySlotpRgChgUserNumRqfWrappedDebugger nParDescMax{rgbWrongClientCard nAsibi sbWsNlsKbdFileSpecfGraphicsBoard pMouseData= nChgUserNumRq agentParamsI nSwapFabsiInitRunwpMemMapm NodeNamergExitFileError nKbdTimers nNetUsers sZblkLocalw IntTaskSwitchnParDescyh6 iInitRunVideomsExecsStat hwIdCMOSAddr rgOSbExch  cbNeed386L cbRgInitError< rgNoWsLineQ nSwappingRq nUNBlocks sWblkLocalo NetServerData exchQuietsbSwapFileTryEach, sbSwapFileTryFirstPswd+ pRgSwapMode rgDmaAddruserNumClstrLastrgsgAsibiInitRunClusterupRgTerminationRqcbRgCheckConfigPswd rgUSegfLL mbIOPort nGdtCallGatesrgCommDmaEnablecontingencyLogcbCrashDumpPassword nTryNewMasterM iColCurrent rgbStackFault FilterProcessExch nWsAbortRqrgbBogusOpFault iInitRunDumps cbRgCrashMsg csgPmMaxGpLibSearchPathHead nInitSmallXrgHwIntTableDescH fHighSpeedO pRgWsAbortRqrgbXBusTimeout bMasterCpCpuIdnWsUsers sMapCurrent iInitRunRkvsq cbOsNameMax userNumNetMin- sEnvironmentsgRgHardwareIntDescprgRqNoRemoteTerminationf maskiBufLED userNumNetMax/nUserNum nOSProcDescrgInitProcHardWare̙ rgfSrpClockOnMsgWaitnDctQsbNlsKbdFileSpecclusterTimeouta cbInitRunSeg{ timeSliceHbcSgWindowableVioMaxFy* nRgMassIoқ rgClusterMsg nExchgf rgpStatistics  sProcStatU sbOsNameSrvr/ cbUtilRegg rgbBogusTssFault hwIdCMOSChecksumAddr rgbRangeFault fMasterFpexitRunFilePrioisgGdtCallGateFirst fProtected} mptyDevMask nGDTSlots~ pExchStatW nWaitSmallXInit8259RawCommNubISDNADInit8251 ServiceHwIdRq XBusTimeout third8259AInitStatusVideoStartRtc IntHKbdXmit GPTaskFaultInitRtc InitConfigTimerDmyISR SysDeviceInitInitVpSwapFileInitUcbs ClockTestSchedRawCommNubISDNB2bellRqInitEisaConfig QuietProcess InitNlsTables mouseData rqTimeKbdCheckForDAIModuleTimerInterruptAllocMemForxLat LpInterruptInitKernelStacks trbGInfoSetKbdInitInitDwellCalibrate InitLoadFSRawCommNubISDNB1 BootBlock rqTimeVid PageTaskFaultTerminationProcess LoadAgent InitComm2InitReadEisaCmos InitSpecHeapIntHKbdSysInProrgRcMax InitSysComInit8237 InitDebugNubRqExInit NmiTaskFaultSysTime KbdProcess LoadFileInit mask8259AKbdTest TraceRawInt cascade8259A RestoreRTC RawCommNubBDoubleTaskFaultInitAllocUsersInitVpStructures RawCommNubABInitSem BmicInterrupt InitDynLinkDAIFromHardware InitNameHeaprgPrgLocalServiceCode RawCommNubCDAddressBootBlockStackTaskFault InitStatusLog ResumeTask RTCInterrupt InitVideoSoftwareDmaInterrupt BreakRawIntInvalidTssFaultInitOSNamePlace InitDbgOsIntfCoprocessor2Error FileSystem8W ' GUU U?-[,FMR QZvClstr vClstrLfs vSrvr vStnd Y2-8`|)jVLVL T TI"SN - G#˜ TT#,qO,U[``p0 _TTT TTTmv^TTT T TTu3`a TT! : @`@2  m`jf /U5U%UTTT T .0U2G4U_TaTeTgToTqTsTuTwTyTܢ .t T 8.< `.hŢ .n\XTPLHC@= 73+' #$(,048 <@DFJPT\`dߢhۢlעpӢtϢxˢ|Ǣâ}wskgc_[WSOKGB?< 62*& "$(,048 <@DFJPT\`dޢhڢl֢pҢt΢xʢ|Ƣ¢|vrjfb^ J ; :4@@T@? C&a2&DT5 AT 8_7i `` w  k CRASH STATUS (ERCLAST CRASH STATUS (ERCCLUSTER NOT RUNNING, ERC = CANNOT LOAD EXIT RUN FILE, ERC =INITIALIZATION ERROR STATUSPrimary SysService00:Run Extended Crash Dump and reboot to regain high memory. 4A Unisys CTOS ClientCard is required, but not found. 7Unisys ClientCard required, ClusterCard is not usable. 5Incorrect switch settings on Unisys CTOS ClientCard. 4This CTOS operates only with 80386 and higher CPUs. GP faultDouble faultDivide faultINTORange faultBogus opInvalid TSSNot present faultStack faultDefault int vectorXBus timeoutNon Maskable InterruptPage fault nmi address: Bus timeout: Memory parity: (during dma)Utility register: ys]DisplayConfig.run[sys] e |1Ki){?T"c\ -a[3!aO2 lӀtŊVj#&Ϣ ~ìgiM=D `= Sys  + p* + , [Sys]SwapArea00.Sys ǢE D [Sys]CrashDump.Sys EX"  [Sys] [Sys]q  T O TT!  V>V>  VQVQ}  VJVJ  v V'V'Ѡ ( o V V 0 V:V: 8j V4V4@ VPVP<8E8E"@Ȝ8E , VV3A8E = VAVADB8 V VӠU C8 V VӠf C8EwD8 V VӠ ES8E 3 VV@F8E  V-V-Ǡ!G)8 V VӠP2;B  VMVMQ; V VРR; V VР S@; V VРTڜ;B  : VV U;B  VHVH!W; V VРJ22 8ECw8ET@ 8 V VӠeA8 VA VAmvB8 V VӠ CZ8 V VӠ CL8ED8 V VӠ E8 V V@F8 V- V-!G8 V VӠPw; VM VMRQM; V VРR; V VР S; V V1 S;BB T; V VРSWq; V VРNdd֜8Eu8EwAW8 V- V-D8 VH VH_ @F@8 V VӠG8 V VQ;B SQ; V VРT;B : V V  U;B  VTVTy @Vv; V VР0 @Vg;BA @VU;BRW;B \@ VVcW;Bt`Ϝ VA VAaŜ V Vb V Vc V Vd V V eb V V@f0 VM VMgǜ V VRߠ=8E &8EAF8 VA VAm/P2; VM VMR@Q;B Jw V=V=QR; V VРbSq; V- V-sTۜ; V V U; VH VH\@V; V VW; V VРV ,8Ek8E@8 V VA8 V- V-C`8 V= V=u DF8 VA VAm" E8 V VӠ. @F@88 V VӠ?G)8 V VPP; VM VMRaQn;BrQ; V VР#R8; V VР$S!; V VРT ; V- V- Uw; VT VTD @Vʜ; V VР @V;B @V;B@V;B WL;B ) VCVCZ8E-8E>;BOA ; VA VAj`C; V VРq$CU;BDf V VEҜ8 V VP; VM VMRQ VC VCT ;B @ VV Uߜ;B @ V$V$٠@V;B Μ VV WМ8E ; VOVO^`> T Tlߠ[Sys]PS_V.sysJKs][Sys]InstallVdm.RunvD]smܠso٠[Sys]Rkvs.Runsq֠[Sys]ExtCrashDump.Run~ussӠb XsuР[Sys]InstallKbd.Run6 Us[Sys]Oem1.Run9s[Sys]Oem2.Run$s)[Sys]Oem3.Run) s<[Sys]Oem4.Run<s Oys]DisplayConfig.RunOsk[Sys]SysInit.RunϠkǜs[Sys]Signon.Run sw UN6[Sys]NlsKbd.Sys[Sys]Ws###>NlsKbd.SysQb] Kbd: K M L L w SysInO E K H D w Termination 9 I D : w SchedL 3 H B , w LclFileSysN  ( D :  w 'FileSysa '  C 8 ' w /Agent+ / B 6 / w 5Init 5 ? 0 5 w :KbdInternal :  6  0: w FMassIo F F w MFsPocketڠ M M w VScsiManager V  Vܜ w bFsPeriodic b  b̜ w mMstrAgentRcv m ՠ "m w zMstrAgent6 z ˠ z w Swapper à 4 2 4 w VideoSem   w HwIdI  3 6 6 w exchSchedPocket   w exchQuiet   w exchRqTrackerV  $v w exchSpecHeapϠ  &f w~ ExchOSNamePlace p (W w{ exchPit h *E w d9 V6V6 SyncKbdProcess̠ Y ,; wmPKbdProcess] NqA V V   TimerF H ~XĜ VUVUw SyncFileSystem/ResourceMgr > .* w6ResourceMgr͠ <   V.V.Š SyncSysInProl  0 2  w)SysInPro 3 k V(V(Ѡ SyncTerminationProcess  2 8 8 w&TerminationProcess&   VV 5SyncServiceHwIdRqj 5 1 : :5ޜ w9ServiceHwIdRq9   VV GSyncQuietProcessr G 0 < <Gʜ wGQuietProcessG  Ϝ VV XSyncSchedh X  / > >X wș TSchedT ZNull^Z̙ VVЙ VNVNԙ V9V9ؙ VVܙ VVݜ VVٜ VV՜ V1V1ќ VV͜ V*V*͠ɜ V3V3Ŝ V!V!ߠ VV VV VV V0V0 VV V V  VEVE V<V<TTY  V"V"ݠInitDwellCalibrate S TT$ V?V?InitAllocUsers< TT( VRVR}"InitOSNamePlace{") TT, VSVS{2 InitDbgOsIntf 2 TT0 V+V+ˠ@InitReadEisaCmosӠ@ TT4 VIVIQAddressBootBlockQ TT8 V#V#۠b InitLoadFS4bٜ TT< VVm SysDeviceInitmʜ TT@| V V { InitConfigޠ { TTDx V,V,ɠ InitSpecHeap$ TTHt V2V2 InitDebugNub ( TTLp V7V7 LoadFileInit , TTPl VV InitNlsTablest0v TTTh VVInitEisaConfig4d TTXd VBVB InitSemƠ8Q TT\` VFVF InitNameHeapڠ<E TT`\ VDVD InitDynLink@4 TTdX V)V)Ϡ LoadAgentD$ TThT VVInitVpSwapFileѠH TTlP V@V@InitVpStructuresL TTpL VVInitKernelStacksàP TTtH VKVK& InitStatusLogܠT&؜ TTxD VV4InitStatusVideoX4Ɯ TT0|[Sys]Nls.Sys[Sys]Ws###>Nls.Sys[ [Sys]Config.Sys H ] ^ ٠[Sys]Ws###>Config.Sys[Sys]HW###>Config.Sys/`123458`9`<=>?D`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_`@ VV?Ԝ VV?Ɯ V&V&ՠ V V o`] Ǜ#FJ`@8>,Xt RequestCTAsm R12.3.1??SEG??SEG VirExchRgoMEMORYVirExchMEMORYSTACKSTACKrgTablesmemoryrqSeg0oemsegrqSeg1oemsegrqSeg2oemsegrqSeg3oemsegOCodeoemsegrqSeg5constrqSeg6constrqSeg7constrqSeg8constrqSeg9constdatadataTCodememory ExchGroupRqGroupDGrouph(()Th \H H HHHhDH$ƘH$˜H"HDh' HZ!"l#: $  % cbTCode% rgPrcLookUp nUsrRequest rcLookUp  rgSwappingRqp(prgSCntlInfoUsrprgorgExchReals rgPrcLookUpBasek,nTerminationRqInit!nSwappingRqInit#rrgChgUserNumRqdgprgNReqRespPbCbSysBrgRcMaxnWsAbortRqInitrgTerminationRq srgExchRealא rgWsAbortRq:.prgNReqRespPbCbUsr nChgUserNumRqInitT rgPrgRouting\rgPrgLocalServiceCode% nSysRequestprgSCntlInfoSyszJFà M TT L T T  K TTI T T X L K J I HB FQP C = G F J ?I- ; :4B 8 7: 78. 2/< /)3 2!6" +#5$% '& '' (,(0)/*&+ #,$- . /0(1 2 345"6 7!89 : ;<< =>? @A B CD E F G H IJ K LM N O PPQRS TU V WXY Z[ \]^ _`ab c ddefg hi j klmno ߠpqr ܠsѠtuv ؠwݠ xԜx Ԡyߠzޠ{ Ӡ|ܠ} Ѡ~ Р٠ ̠נҠ ˠԠҠ ȠР à Ġɠ̠ˠʠ Ƞ  ŠĠà                    |  { x tyf|{r op l kgt inkjn cmQ ` _ePhgf [d X Wa`_ZWVZ OY< K JP DTTTT <RTR Q P$ ^MM  /  K )ZRN  , 9I VKK  ) 4 $ "^sԠJG H  (4.0I F G 4 Cd.L F 9 CIGB A IW ,FA : Wcޠ$( E? 7 c۠( H>  2 Co, C: 3 oˠ0 B8 0 oɠ |4 A8  . |U8!@5 3 <?2 ( X@> 0 % $ ɠD="- ", "H<$, $) $oLA&, &  & wP>(* () (jT9*' *  *cX8,% ,  ,W\7.# .  . `60! 0  0 % #d52 2 2F$ h44 4 40l36 6  6W ֠pݠ28 8 8 nt٠1: : : xԠ2< < <0|Р/> > > .@ @ @)&R!-B B B):N",D  D D:Ѡ#!#+F  F  F)#$*H H H:͠%)J J J)ܠ5&(L L L:ɠ''N N N)ؠM (&P P  PM))R R  RCX*$T T  TX d+#V V  Vd,"X X  XX-!Z Z  Zdl. \ \  \l/%^ ^ ߠ ^ߠ0` ` ܠ `M{ V1b b b{r2d d d{p3f f fӠ4 h h hՠ{5j j jM6l l lƠ7n n nM8p pݠ pɠk9r rڠ rCg:tݠ tנ tX c;vܠ vӠ vSq<x٠ x Ϡ xMq=zנ zʠ zMf>|֠ |Ǡ |e?~Ԡ ~Ѡ ~Q@Ҡ Ϡ \AР ʠ CFBΠ   TC̠ Ġ C>Dʠ   !ME Ƞ  8HF Ơ Š C2G Ġ à C 3H    C}$9I    ()J  #  à,%K    0!L   4M   8 N 1 0.<O  @P / LDQ Ԡ Ѡ"  HR  LS ⦆ 8PT ̠ "(  &dTsU  ";XV ޠ ;gL ܠ\W ۠ LT_(  &%`X ؠ _?x,*8dӠY  x$ hZ  Cl[ ﭠ p۠\  $ "tߠ] 褐 ܠ TxӠ^ ذ à |נ_ 怒 Ӡ`  CMSa  n֠b t y͠c q sd  " ͠e٠  ɠf } CAg  wh  ui~ } sj| z ckz w alz t C5&mw q &Mnt n [ot s C/pr c 1 qߠn ޠ 1:rޠl ۠ 18 Bsk  B%tޠj ݠ C%}u۠h ڠ OK$ yvޠb נ K^uw۠b Ԡ ^n@sxܠ` a n}yՠ`  B dsz֠^ ] Ej{Ӡ[ M ke|ҠX L ɠm}ѠW  M @{*[i~V N {֠WՠS e lRԠP b iFϠL Z bB̠L m n >ˠI S ; :ΠF P L6ˠ C  M _2Ƞ D ` f6ɠA T  ٠ 2Ƞ? R $ "/$-Š< > " ֠(): ; " ,%Š8 8 n.0!Ġ4 5 X 4Š4 2 <8 0 / T ><2 ,  $@ 0 )  "]D "- "& "$H $, $ # $$ 0LL&* &  &0P() (  (CT*' *& *C8{X,# ,$ ,8C\.! ." .Cڠ`0! 0  0d2 2 2Cڠh4 4 4Ol6 6 6OƠp8 8 8CԠ Z5tߠ: : :Zax۠< < <am"  |נ> >  >mlӠ@ @ @ϠB B  BwKˠD  D  DiǠF  F  FCƠ  H  H HCĠ,*$xJ J JQL L L4#6(4\N N N#P P PcR R RC$ "vT T TV V VcX X X  Z Z Z  \ \ \ڠ'5^ ^ ^'Š` ` `C3b bݠ b3A d d dAf fؠ fC{h h hCPj jנ jP b l lѠ lb|n nΠ nCp pˠ p'hݠ|rޠ rȠ rhpxt۠ t Ơ t=t$"tvؠ v à vt`$ Yx֠ xؠ xMZzՠ zՠ zof a|Ӡ |Ԡ |6$ "'(~Р ~Ѡ ~ $ "'#Π Π  ?Ϡ ˠ 5͠ Ƞ C ?ˠ Š Ci3Ƞ   ;Ǡ Ơ C"  1   Ӡ-  Ѡ 2   oP$.  (:  ̠,6  %0   04 Ҡ 8 ˠ <  /@  D   -$ "H|  -xCL  C` U: Pa v  ULT u  UJX t  UH^ݠ\ܠw  ^=j$ `v  j/}$ dޠu  }hx  CXlw  CV*Sp٠r  tՠu  OBxѠt  O@|`oq  ,ɠr  ؠo  p  CHo  O6n  O4m  CBl  O0k  C> rd  i ~ C: 5d| | "  ex y ~ ddw v  eqh5eu s T)$ 6a8fq p )Ccs m C.=( &ɠ`m j =+U]m g U`l d fah  a fw  y^f  ^ w}]g  [ C""  kqZb  X ҠtYb  U  TcZa R C& $eY[ O aX\ L OeW[ I oRX  5 A$ E`QT H gPT  / obSS  G C ]MO  C }YLL  @ oFKK K } DNJ 7 C@MH 4 C IN E @ W ޠ1G B B L4L@ & :  ( >E>    *$9 H> = C(( G< 3 |, F: 9 z 20.  ;8   )$ "54 F2 ! )8C4 3 t<">1   A@ = / ( ?D @". "- "nH?$, $+ $lL>&* & &CP=(( ( (C=yT 8*% *  *=ߠX7,# ,  ,XɠJk\6.! .  .JΠ`50 0  0J̠d42 2  2dh34 4  4dl26 6!  6WZp18 8"  8W d#t0: :#  :dx֠5< <  <KĠ|Ҡ4> > >K ޠ @ @ @{k͠!.B  B  BkԠ"1D  D DР#0F  F F̠$/H H Hz(  Ǡ% $J J  JzsH&'L L L '*N N NC0(%P P PhF)$R R RR*)T T T+"V V VX,!X X Xd.- Z Z Z:g.%\ \ \&$ "/^ ^۠ ^ 0` `٠ `1 b bנ bC2d dӠ d3 f f fՠ @4h h Z h ݠ  5j j W j Ϡ  *6 l l ˠ l Ǡ  7 n n n |8pߠ p  px9rݠ r  rv:t۠ t  tW \;v٠ v٠ vhk! ! X<xנ xנ x! - ]=zՠ zՠ z- 8 $ Ԡ>|Ѡ |Ҡ |8 M $ Р?~Ϡ ~Ϡ ~M z b zZ@ Р '  b ck $ "ݠYA ˠ %  k X  UB ̠    @ ̠ OCɠ ɠ  2KD Ƞ Ǡ ?F EŠ '  XkBF Ġ '  ;G  Iw H  $I  Cy(%J   + Kl ),.K   0+L  WW4'M  Mf  x8N    C<!O & ~  @P   WO  IDQ !  HR ' w XQ  *LS     ߠ $"5PT    ͠TU ' q  ?XV $   ˠ\W ' m  `X  Ѡ  dY ' i   $ "qhZ    l[  p\  |t]  | +xР^   o * ۠|ޠ_ ' ] * \Ҡ`  } xΠa  z U0Ҡb (c J81 * (Qlc  1 Md  e  f  C?g { Z" K 0"(h{ y K ) g 0"(iy x g  0 "(jw   kx q lw ` 'Jmv  ] ]nߠq  _ oޠo  \ m $ "pݠm f  ˠ "qܠl c  rߠl d }sޠj b  ywt٠f ]    u Ҡe a  v Ѡc _   4nwܠ_ K  r  , $*qx٠[ _  kTy֠^ ܠ ՠ VzՠZ ٠  J & $ '{РW   8- $ Ӡ'|ɠW  - > & $YJ}ΠS Р > W  '~ ˠS m W ' ʠQ j W EѠO F AРM D ^ DϠI  A ^ n 0"(z 4ʠD > n Π 0"(\0ɠB ;   ,Ƞ C ;  (Ǡ A 9  <Ơ@ )  X * (U 4Š; (    $Ơ;    k (2à9 )  V $ ",SҠ 6   E0Š7  C 43   , 82   <0   b@ .  `D"- " "  (H$) $ $ L&( &' &8P(% (*  (oT*% *  *C* EX,! , ,* \.! . .; 0 (.4`0 0  0; ֠d2 2 2U 0h4 4  4U c ܠl6 6 6c u 6p8 8 8u t: : :CР Dx< < <  $ E|Р> > > w  <̠@ @ @ dȠB  B  B!   Ġ D  D  D W UF  F F K H H H = J J J 0  ͠ L L L  N N N  P P P R R  R T T  T V V  V  X X  X Z Z Z|w  > \ \ \ ^ ^ ^Z` `*Ġ `W b b+ b Ԡd d, d f f- fC .  &,h h. h oj j̠ jCfl lɠ lIun nĠ nO3 $ ɠqpܠ pà p3 D $mrڠ r rD U  xt tڠ t   tU wg :nvؠ v Π vg cjx֠ x ̠ xt [zӠ zT zt R ΠT|Ѡ |Ҡ | ?_~Ϡ ~ ~ ӠZ͠   ѠV̠  M}  JQ ʠ /  & Mɠ 0   & ;Ǡ Ơ   7Ġ Ġ  3      ?/    $"6 +    C$'   Р Ӡ(#    ,   0  Cr4' + |  8  Cn<~ 1 |3@} 2|  D|  H{ 3w  Ơ ϠL  v 4t  P  u 5q yTx , k  Xw - h \v  (`u   (gdt . a hs / ^ ֠lr 5c 8 }po  8Otr  |xo 7[ ĠD$ !|n  p D=X ۠ i 0 Q X'נp 1 N CHӠk 2 K Ơn  CDˠi 3 F  Šh 4 C i  x jd h 1 d h  a h y h z h x h n q nu$  q u   n ܠ  k Ԡ n h l h ~~ j Ơ $h'S h  $\'O f  fh U  b h} ` hm P hg \ Hc Z F_ X D[ V BZ T hݠ_ T h۠ SR P $"3M ? A E hԠ  TTt T T /R I i N G hР 5 TT9 T T F @ T T  G TT: E 1 ,"B ; X @B @ O 2. ? H $  * = = $ $& ; 4  (" 9 ( .ߠ, 7 ! .0 5  &4 3  ,̠8 1  &< / & -.@  - - 4 D "+ "4 9H $) $9L &' & >ՠP (  (>נ E۠T * *EΠ JˠX ,! ,JǠ\ . .-` 0 0Jà Qd 2 2Qh 4 4W XƠl 6 6Xp 8 8#t : :! ]xҠ < <] d,|Π > >dɠ @  @Ơ B  B  D  D F F H H J J L L N N k$ P PkrϠ R Rry T Tf V V X  X9 0Z Z ZM w \ \B ^ ^4 ` `2 b bQ~ d d.z f fJv h hJ hr j j- bn l l$  +~ n$  nj pݠ pɠf r۠ rǠb t٠ tŠ^ vנ vàZ xՠ xV zӠ zR |Ѡ |N ~Ϡ ~ Z ͠ 9 C    K ɠ   . 8   ^ <   8   hL ;   )  $ x )  ʠ$ %  ( !  hB,   0    ]4   8   n4<   @   D   H   L   P   T   X   \   `   d   h   l ݠ  p ٠  t ՠ  x Ѡ  }| ͠  { ɠ  y Š  w   u   9>   h TTTT  i  `  i~  U " f{  "L gz } Q + hx { +? ew y 90 du w 9. cs u 9, bq s 9* co q p `m o h 0 aj Y 0,9) Zg k 9! _g i U H( ^d g H {[c e h tZa c hP   Q_  Ԡ P=F G ` lݠ~zTL*% ""r$&(`* , .0<02_04`06&8.:<FӠ>GР@`BpD}FvHJJFL@N"PRT V XZ]\,^_0h``0ebdfhj۠l Ϡnp ۠rРtܠvΠxʠzǠ|~_0H`0Es]Mנ # TT! ZT& ) TT 1 T T a  X TTG T T D R T T  C TT  T TTC T T  B  P TT? T T  @ N T T  ? TT  L TT; T T > H TT 7 T T < J T T  ; TT $ D TT$3 T T : ( @ TT(/ T T 8 F T T  7 TT , < TT,+ T T 6 0 8 TT0' T T 4 B T T  3 TT 4 4 TT4# T T 2 8 0 TT8 T T 0 > T T  / TT < , TT< T T . @ p TT ^ T T  + TT @; T T ͊t FileSysWrap R12.3.12COEDFileSys FileSys_002 FileSys_003 FileSys_004bbb`' FileSysGW`.|0 `pj Dpww0 Ver FsS_N R1.1.0 Linker R12.3.1&&&&O55;BOENVZ_ aoj_`ntdOd0e@ePkq?su?w x_Ј/0` ? `  ? `P P@@P  '5_7oP<<?@MQ_e/pion?Pp O /_`\ nɀt v./kN,Ѐ؀uo ]* !  M  (7;WfX-X=XbXXX0X?XX&X=XSXXXX\XXX%X0XsX @nXnJ+C.GMR +H; (duOoO(OOOOOOWDYm3Rgw 9d2'4?"1?Tu {g"p"@"I"""""""I-6-?--- - - -/##### # #q # ###EAAAA A>"[c   \rZ\,B xNb%2  \l!l!l!l!l!l!l!l!l!l! l!( l! l! l!: l! l! l! l! l! l!l!t"t"z">""k""" " " "; " "8"E"""#####7$w7$$$$1$$$J$W$:$$eq&rq&q&+q&8q&'n''Y)Y)Y)Y)Y)WY)Y) Y) Y) Y)\ Y)Y)Y)Y)iq*q*q*!q**F**r* *k *^***N****A**I** *E**{**g*t***J*_,_, _,*-*-*-*-*-@*-*-*- *-D *-------'-=-^---5-.%.J.XNOU"-#&Ah"B%Tt !e!l!t""#7$$q&'Y)q**W,_,*------..eIWh Z2_gp{T W  U   &40p5Wes| C_pX%X5X^XXXEXjXXX!X&X5XEXX[XXXXXX-;IWes$'8F,67A"0>LZh v3 $OU-;IWes&8d3^r;9GUcqwO0OgOOOOOO)O7OEOSOaOvOZO`OOO Lau ';Zo^:/Gvz"/<EJNRVZ^b flv                              +KYmMqNs!UU8UIU*USUeUUU)UUUUKU_U>PTX\`dhlptx|*mr!;^12]"9"""""""Q"n"|"""""U""""""""-"q""""! " " " " " "o " " " " " "Z "a "| " " " " " "F "{ " " " " " " " "">""""q""" """"2"<"D"R"]"m"r"--i-|-------------J-`---- --+-G-p-----#-t-~----- -. -= - - - - - -0 -C -{ - - -= -T - - - - - -) -_ -| - - - - - - -; -I - - - -,-b-r-----%#;#N#^#t##y##'######### #. #e # # #a # # # # #g######]&;&&gAAAwAAAAAE A[ A A, AJ Ad A A4 A%3z1EA R A ~ X .Z:~ .B8N08f hh?h{hhhhhhh'h5hhhhh h'h\hhh+hhhhqhhh hhh:hBhNh]hbhhhhhh hehhhhhhh h$hYh_hhhhhhhhhRhzhhhhhB hH hZ h h h h h& h4 hW hh hn h| h h hg"""""""""B2BIBjBB B6B=BBBGBBBBBBBBBBBB"B(BBBB BBBBBBBBBBB7B?BBBBBBB!B4BGBPB]BjBoB}BB(B:B}B B B BUz'bs %%"%%%%$%,%V%]%%%%%%.%:%@%Q%_%%%%%%9%M%%%%-%5%P%%%%7%K%c%~%%%%%E%K%(EKhw*17FLU $17^x $,[a F\r{/AV^*>3M| @Qlr *V%0 T,39"{ $MV^w3<DUhqy~u*4k4Vu +3DWk~#?ES[m  ( - 3 < A T g o             = N T o           / ? `      DTTTTT,TsT tt+t|tttttttFttttsttt)1ty!VB [ a    : ? b h    , 4 ; F p      H       1 G [    a     M t     3  8       y       #  Z  v         ]          R b -!H!! !!0!!!!@!\!!!! !l!l!l!l!rl!l!l!l!l!l! l![ l!z l!N l!X l! l! l! l! l! l! l! l! l!=l!Nl!l!;l!xl!l!l!t"t"t"t""2"?"O"c""""""D"`"r"""""F"u"""""{"""""""}""""" "(":"H"v"""" " " " " "w""""""4"^""2#q#:##$#[###F#27$87$a7$7$7$7$7$7$,7$17$?7$Y7$w7$7$7$7$7$7$7$7$A7$G7$t7$7$7$7$7$7$>7$7$+7$W7$r7$7$7$7$7$7$D$$ $$&$8$J$\$$$$$$K$$$$$$$$$$ $$y $ $6 $O $q $ $ $ $ $$$O$Y$c$m$$x$$$$$$:$?$$$$$$$$Z$$A$mq&q&q&q&Qq&q&q&q& q&Pq&^q&jq&V'z',''''' 'X'''H''''''''='v''''''''''2' 'x'''F ' ' ' '$ '9 'Y '~ ' ' ' ' ' '\ 'x ' ' ' '< 'Z 'n'''Z'''''+'5'''1''''''Y)Y)Y)Y)7Y)Y)Y)Y)Y)MY)RY) Y)) Y) Y) Y)3 Y)m Y)rY)Y)Y)Y)Y)Y)Y)Y)#Y)*!*8*********&*?**.*********/***+** *3 *~ * * *e * * **B*-**c****.*@*N**>*****l*)_,6_,_,2_,<_,H_,N_,a_,_, _,^_,_,_,C_,o_,_,_,_,>_,n_,t_,_,_, _,h_,_,_,_,_,5_,J_,|_,_,_,$_,_,_,_,g _, _, _, _,. _, _,, _, _, _, _,% _,| _,G*-^*-c*-i*-*-*-*-*-*-0*->*-p*-*-*-*-*-|*-*-*-*-*-*-Y*-*-*-t*-*-*-*-*-=*-Z*-q*-*-*-*-*-*-*-r-S-m--%-=-.R.W.MARTL^ć4FF t.vPPPdPPPHPP^ FFvćF FF u^F&8t^t&^ğF ^F&8t&Gs^&Grm@Pj`^FG0vt F^w^ F^&vD$&GD8&G Ft U(&G(&G(&G(&G(&F]U^&G t: : (^&G t2 2 (^&G t> > (^&G t4 4 (^&G t6 ^&G t@ ^&G tB( ]$lPLPtl&M(&G s0-((u+J& jjP/|Ptl&GP(PtlP(Ptl~P(Ptl%F >`t f&^FF; w% ;u;uFuҡ( u4f&j PF%FM(&s )jxjFN؎&W&G &O FމvN+FމvƊ&G&GFދ~&G&jFxzxW&TF(HF棆jNFF9rF^&G fNFs١K(8 tr@P8 P8 PF8 H;Fr3hvFHXXFuă>< t)F< H;Frj`FءG0Fuܡ( t4PF(H;FrhvFuܡ( uK(9ru.NPXf& rFFF?w!n +&+&HFu׋FF(HH;Fr&GF&F,u&>6 tTt;K(tMf& tNFtFF;6 w_^&F`F FuAK(NFFF;6 w j F^&`Fu׃>(t-FF;(whFءbFuh|PPQPNPtlhPPRQPNPtlhPPQPNPtlhPPQPNPtlM(&Gr[&GrSM(&GsjPj Y ^&BM(&Gs/FjvFP, uF$< u ^& F^&BM(&GsK>( uF~w3hjFu$>(ujj>(uhjhjjjGM(&Gsrhjhj$M(&Gsh0j shjM(&GswjDuvjDthjwjDthjdjDthjQjDthj>FPsvj)FP svjM(&GrFjvFP, tjvFP؀ tF%@uvjvjUF$<u vj F$<uvjFtuv#F$&Gs"ފG{$G{uG{ZG{&0&0ZG{GM(&Gs(Z$uƇZ&0&0ZFZtG{$G{uG{ZG{Z$uƇZ R^8FZw:~F;vvF;u F;v^t>RuDM(&G s#&Gs&0&0M(&Gs  RM(&Gs"&Gs\&u $uGF^M(&Gs&sj?)?)&w &w ?)&w&w FPFhPP^SPNPtlF^M(&GsJ&s?)& uj"j?)&?)&G r &G <t<ujjU?)&w &w G?)&w &w FPD?)& t0uj&w FP$>uj?)&w FP hPP^SPNPtlM(&G s!&Gs>u&0 R tM(&G s&GrPPtlF?;)&G&OP&G=u@[;PN ;ڱtA4Z;" FFs=;)&G&O++&W6M(&Ds;)&;)&G F<tAM(&"ON<uQ?)&G F^FFFF}F 10^v&F1FFʃ>tw~uFt>n&uf F$ FFF;F^&tG4:Fu Fs FF̋^G5:FrG^_FЋ^WF$p t 5uqFU]U~t8^Wj^W^W2^W]9FuX>uLRQPv4>j j\Ptljj\FHN;r^Fu*>u.j >ujPPɀPtl0M(&Gr&Gs~uj Lr 6M(&Gs"j{RPRPQhRPQtj RP6K(j6PtlF;u6NF0>v^jM6FFL^WL^WL ^Wd^Wd^WjhMF u>u ^_0)FFءG0F^G0;uF^G0F9Ft^G4O5vL'TDD8DD!D/L->M(&EsGXD5DK{M(&Gs ^G5@M(&Gs^G5jDF>un~u ^GX.~t ~u ^GX*{~u ^GXk^GXHa9Fu\^G4G5GX^G'OGGG#G)G/G1G-6M(&DsG5^G5MFuf^G4G5>uGX ^GXF^G'GFGFGG!GNO-O+NO/NOKNOINO3NO#NO%NO'NO)G5 G6G7^G4G5GXN^O'ONONOGG!FG#FG'FG)FG+NO/NO1G-G5F^G IL D!D$\BD>DQD6DRDUDWD"DXtDTDSVT^GTGSST^GV^GXuSjvj|Ptl>uzFN؉OO G GGS1Ptl^GGj j\Ptljj\vK T^G5t^G!^G>h&tjh&&P(Ptll&P(Ptl&%F ~&>@ t,FF;@ wjLFءd&d&^&Fuك>B t,F<F;B wjJFءb&b&\&Fu١D p&`&@Pj&؍Gf&Fp&HN;rj&H@Fuڿ& 򤿔& 򤿤& t& r&~&x&|&r&P1PtlFF;zw\6~&cPtlFu>h&t?n&ts2vFn&An&h&NFj$Us]˃>h&tJ02.,48,:.P1PtlM(&G s.RPRP_LlRPjv4L7RPjv4]^~FF$~FF ~FF~F~ FFFFvNʺWRQ6n&PQFPWRQWRQhpmcF u?F~v.vPNQjNQj$NQNQRQPhF t~ujPtlF멂~u~tKFα"t<tM(&Gsjn&FPF$<ujjhMFʋF u*>,u ؉G0,)FʉF̋ء,G0Fʋ^ʋG0;,uF̋^ʉG0FʊF$<u ^GO^O@n&G NO!V W$G4v Dt % F^ʈG5^G6FGFFGHGDvfPtlFRQP6n&vP^ʍw>VRQPG@PGPhsmcPtlv^ XZ^ȋ^ʉGBFFF~ve^w>PNQjRQPFPFPGJPjhF u~u&~tjPtlXFs^ʀLuE~v?w>PNQjRQPFPFPGJPjhF~uFFFEF$<tjhMF uؠn&G FG!F G$vfPtlFRQP6n&vP^ʍw>VRQPGPGPhpmcPtlv^ XZ^ȋ^ʉGBw>jGJPjFPFPjFvfFF tPNQjNQj NQNQRQPiFFt5~urzl^W$^Wl4 ^Wl^WL7^ WL_^ Wl2 ^Wl ^Wv6FP!vj jj Jr$RPjv4hYsFGGGGGG GGX <LJ=G:jPPɀPtl$^$$(:!Ƈ"#$Ƈ%FF wN^?Fuj +RP6K(j6PtlF^wXj\F^=;EMDth|$^UDD9FVuUt uTu VFVFVFF^~u~tF$G^.^G ^G ^G ^G^GNɱuAONɱuAONɱuAOG#8Fu^GG OGGOOHF$^G~u~u>^.lt}^G +^G "^G ^GF$ ^G^`.^G^G^G^GF$u@^GF$u@GF$u@GGFVut uu-VFFwV^v@FuvFVuUt uTuc~u~TuFFFF;w4^W;t#VPG^+#NV@Fu‹VV^G~urzl^W,^Wl4 ^Wl^WL7^ WL_^ Wl2 ^Wl ^Wv6FPvjj@j Jr,RPjv4hsFFPF^GGGGFsO@Fs^O Fs^OFr^O^GG:~ uGX&>~ u ^GX#.~ t ~ u ^GX'~u ^GX%^GX$j^ꍇPPɀPtl,^ꉇ,G tƇ2^ꈇƇ~u ^ꊇ^ƇFFwBJt3Q^H~ u ^GX#.~ t ~ u ^GX'~u ^GX%^GX$4^̉4CF戇V爗ƇꈗFsƇ^Ƈv^̍v^̍ F^̉G:FմF^̋;Fr FuF^̉FsOFs^̀OF^̈Fd&Fȋ^ȋ t>Fʋ؍G,Pj jFPFPPtl~ uFƋ^ʋ^ȉ^&빋^wX4RP6K(j6PTtlF^Guu^^' t 5u^jPtl^G uƇ ^FFw1Ȱ^u  Ѱ^ VFuNj^Gu  ^$^RGZR`ZRbZa.&.6n^R`ZbF.&HN;r$^a.&:th|$Fű^R`ZRbZhFFw8^RZšF~ w^ FuFu^„Gt ‡ ^‡ ^wXj\~urzl^W< ^Wl4 ^Wl^WL7^ WL_^ Wl2 ^Wl ^Wv7FP,vjPPJr<RPjv4h,sFGGGGBGGG:jPPɀPtl<^<& jF^ً^~K(^G <;OW vD:GP"G_~tj < RP6K(j6Ptl^GX ƇLJFFwFv^ FuF F wXFv^ FuF^(j +RP6K(j6Ptl^OGX ƇFFFFwNȋ^ FuF F wNȋ^ FuߋF^(F*F^wXj\^Gu*@^^^ P^x^ k^R Z$$^^' t 5u^(^' t 5u^"^wXj\vs^^' t 5u^F~dwI^2^' t 5u^2^' t 5uFu^^' t 5uFFt^0#FuuU]e emeeeXje  @  % @ 9fddd [[ [f999e j"dddfjj j (  j eetd1d~!je,eeMeeddeee(NeN Gesd~ Mesd~MdNN\jetdQdV!jeHjjjjG<GGYe0eHfdjj j Xj@  j j(@ @j eetd9@t2jJnt@999::9 9etd#::etd9eQ@j 9etdddd~jej*e@j dd~ ~@j eN@``jfjYme_=j  Ǔ8`` etdj4jfjXeajfjYejf4jXe Ǔdddedj;jfjYjme_;  jfjY jfe4ey4jfjXjfjVeey9j9@=j999<=4@99 9  e<=jj<<<==e4eaej*ejfe]Ǔ1jeyeetd~ Ajeje Qj4jfjX4dddjeea4dj4(eajfed d ddje1jee18>IIAjjf4jXjfjYeje@02jJn0ee esd:esd:GGAje6qj`jjjLeenldjj Le Tee eellmlmlmlmlmlmlmjmjmjmjmǓ8bjf5jYjme_ h5jfjY44jfjdmdddoej t td!jetddddxajedjjj0jJn j  ~jjjj<<=dj=wrutRQPv4U 2tP1$>rtzjr~t}j@FSj@j`PFPF`b?#t'>`PFSj@j`PFPF`b`P ¿Y? `>bhF#tPFf^vxShjdPFPF>vdfdP ¿Y? d>fhFShjhPFPFhjhP ¿Y? h>jj t j~PlPɀPtlhF؉vxShjdPFPFF=sBP+N+F؉vxShjdPFPF~dsj$>vj +RP6K(j6PtlK(td(zF;u6NrFB>vyjH6rFuFt^Wt^Wt ^Wt^WtD^W~u(^G FFwLP^^@&Fu8~u4^GG G"FFwN^H&FuFux^O G F G"FG$NFwN ȋ^H&FuF6^GF2G@F4GBFGDF|^G F%FPG G"FG$FFwNpȋ^H&FuFf^GFbG@FdGBFFGDFDGFjhMF u|p>tu ^_0t)FFءtG0F^G0;tuF^G0F^HG G!G$G,G.G4O5G6NOBGJ2GHWFGDw>w@ GLGM$TtS^G!ut/W W0 t 5u^W0FW :^W0 t 5u^W0 t 5u^W0F~u^G t  G^O~th_$^G t$tppu^hOpu^Oj j\Ptl^Gt7W  t 5u^W vD! DLSSF?^GtdW$Gt+W  t 5u^G! ^W C^W d t 5u^O! ^W Fd t 5u^Gt~v9DHvG^G^W GvDL$LHI W2^W*^GFr^W,f^W.Z^W0N^W4SFF^W2^GL t 5u^W4vDO@":u>DN  t 5u^W4쨀td^W4^GO^Gtt W ^W j j\Ptl ^!uH^!uzHFN^&G&׉FVRPjju^F&?t2^&t(^&t^&vDJ&GDH&GDFU]F~0uw$F~ w^W4쨀u FuFuհ9FuO>u\RQPv45j j\PtlFHN;r^Fu>uwj>ujPPɀPtl0M(&Gs"j{RPRPQhRPQtj RP6K(j6PtlF;u6NF0>vVj16lFF\^W\ ^W\^W\-^W\^WjhMF u>u ^_0)FFءG0F^G0;uF^G0FF^GGFG FG"F‰GFG)FG+FG-'GFG HD D!D$D4D5\BD>D6LSDRDUDVD"VR|Ptl>u8^G/G0G OGS1Ptl^GGj j\Ptl^W)0^W+F^W+F^W)pz^W-Fm^W-F`^Wd t 5u^Wd t 5u^Gd t 5u^WF ^WU]s'vFPhlP7^Nis0>I(uI(I(%I(9Fvje$I(+FI(F2>I(u)I(I(@%I(F+N;sje$FI(FUvF]sFPFP*P7V%^^~RPSju^FFVFh@j;)P/|P7hjP/|P7jjFP/|P7v' F  )KpjjP/|P7j(jP/|P7j&jM(P/|P76M(Q(-Fj#jxP/|P7q(s3jjP/|P7j"j|P/|P7&G'(j$ jP/|P7hj?)P/|P7FPLP7F%0 2q(sj(PjB8P7(B*r^ &&W^ StYFVsFFFFF; vxH ؍F؋  uF FP^_ Fr'^F׌F١K(F݉F߉FwF^GFsFF^trFP(P7^&F ;vN^wNFFF% RPPRP<FNQPFPP7F RPRPRP<F RP^SRP<^&F@NFNFt|FF; wHćFF^FuFF; wHćFF^Fuރ> tgF HN;rW؍4^^FFO& O&LO&LO &LO &L &DP1P7FuFF; wHćFF^FuFF; w?%0&0uv  @ p % @ @ @ @$hijrsdecfgk LocalLocalMaster FsPeriodic FsS_N R1.1.0Ws000Ws000Syncxl4  L 6= ) i|& @ |p LLF0F1F2F3D0D0D1D1D2D2D3D3D4D4D5D5D6D6D7D7D8D8D9D9D10D10D11D11D12D12D13D13D14D14D15D15Z0Z1Z2Z3Z4Z5Z6Z7M0M0M1M1UNISYS SCSI Manager 3.3 FJ@,XXP 8 V t ( F d  6 T r    =>ET  UNISYS SCSI Manager 3.3 SCSI0O"GB      $(,048<@D HLPTX\`d FileSystemMassIo ScsiManagerInitFsMountDevicesInitFsSysDevNumInitFsSystemTime InitFsFinish  # 4 U^Sv Pv ^Sv V Pv  FH ;r- V   Ģ  uŸ PFP^SP > t^Svs]Uvv ^Sv QP ^Sv PP Ȋ:r: : v *󈄼 u PvPP^Sv >u^Svs]UdFF ;Fv FH; s  F H ;r: S^6 &^& [ Ĵ  u t$   Ĵ   tpPFP^SP ]Ud^Sv~tA s^Sv~tA s ^SvPeP h^SFPQP ^K}v!Pv9 1ظPFP^SP PF P^SP ]UFPN Q^SvRdWFPQV ] U~Nt+Jt@]U~Nv vv~^Y] UF;w)+^& & uʂ>u]UFH;r"^&  & uЂ>u]UF;FrF]UF;FwF] FFFFFG~uFlN>^u+JVt+HF @F FF t! v v N F~ulb1>u&?{uj_j}shKh jrhKhjsF~uOF6 )KFFr/>Kt(hKhjrhKh )jrE&?[uA>t:&!uF&+uGjj]sI~ut&?!uF&?+uG> w?jj6>t->u &?tjj>r>2vu~u> wjj6j)j6Ft t>tƀ>u>$t>r<0r<9w >>uF4F<2wNO~t>FFw9ر0VsF 1Ѿ+NF 1FFuFs &!t>u9hh js*6& Fhh$jТahh(js9r^\a^^9rh\ tQh؍GPjs=~t'\Gs %tX\#tX,\G&Z t U^uc drD>u4\th\GPjrXb>tXZOwFF;vZhGPjrZCPtZ#;pu``s) && QPP \Z!thG!PsbZGp^\#t9~t3X,+Ft,\Fr dsFX>u@F>tAN"r~uFrFsIFu+JV v vjF@PUNF+ȋv1~FN;s+Hv@]U>>u)~t#^SPj ^FF N]< utj$.(*r>ulFV^\ u]\G&Z uLZHu?ZwFwDwJ< t!ZGLP%FYN=rFwFwDwJ < tZGJ@GJN;GHrOJFvv6~F6 ~Fv6Vw_Fv FZGLwFwDwJ < t tUh]r jhlPLPtljjo6PF t6LPF~tt6Pljhohth>u^ S46F6V &^&&GF9Ft@FĴv &GćN븃>u6p>uhc&u 6LS l SlU~u*^& ?u$^&G&GP&Y ]6LFP u-^&G;uF&GSl6l^S l6lFP u6L^S lU>`u]j]v vvFVr ^;6uF:;uF;9u3^6FV8:QRPjjt<F t6Fv v vKFVFsF\G2^FP^SFPvvFP! U^ Sv vvjt<] UP6:68j7<]U^6v vv8:QRPj7<]\Gt.|v vvyFV\_2^S^ ShRPFP"FPs> u=PPvvjjt<F u"P~ t+JtF FFV FVDF>6>FPDxH6RP l^GFDBF>&u6M(&Ls D5$tG^uS^uGt^wS lj j\jj\^GF|(u\(^_(^?t7^FvDPTR;WRu;GPw(^GPWR^;WRu;GPw^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7Lj j\jj\ ^GFG t GPGR^VuOw^GPWRFVFPl^FS^wHe^S^wJe^G_^S^wLe^G^FVG\^;GNsF t ^G^TuRHWwVjGLPGTP^GvDHH!GTtg^OGLWNvDHGT^GJvL_+gHF9DVvDV^GT9GVvGV^GVv1tHG`>tX TsˡFFF;wc^_0^GBFG(F"tA uB"s O(G*D2^"t ^"u G"S(LFu^G*FG"GB\S(Ps}& ##;t 6K T&vTvTr0^G t vjh,^G,S Tv,nvT<tvZd^G"v|D tJOXQ ɱuAN8WGt@F^t6D5Pu:tSjhL3Lv v ^G*FShT^G^v D!>E9|N(u G\EH ^G\GHGHv;D>t?L"^W uuG8D!G9NGHG:G8F^G"^G\6D:GtG sHWPQwTl^G <w?G\6D:G^D;G_PD<~EHD=XG`D>ߊGDD?GFD@F ^_ .kuG8F@G8E6G8MvDHG:DJG;DEGF^GZsw[AFF[FTFFJ^G"FFG"Fr^G"^&G^GHGJv&DGVHWPjGLPGTP^GGV;GTtQ^&G;v vjh4^GVGTOOLWNNsHWRQPl^gFs ^O^gv~T^GZF tPTF tvjPFs vvv ^GBFG*FSjT^Gt"uPQHWwTl^go~uLFtEPTF t^GA^GS T]^8uTvDZwA~}[:F t3^G=LuF~,uF F@v TF^GA^_^F&G t ^&9O"w^&O"vtA&^OS*U>t L]M(&Gs&Gs sˡF؋ONT*V ҲtB t@ s|"t T^wwTˡ&^G@SjT^wT^Gv|"u G5$tW+^G"<tbvD tX<uvDuSjhE>vj5^Gt vjhG$^G8jTF tvjPvjjˋ^"uZ^GuFEF uvP-TjTF u݋^GA$^:G!tFFƋ^GPGP봋^GtFG뤋^G8FG8jTF ujTF u^"t8FuvLAЀPuG"D8G!D9ShTjTF uˋ^"tSTЈF^2GVtFGVGWuOW^WK t^G5XtvTu vjLT^GWtS TF^UMtgW^gWG"SZLvsv~^u v"F~u^uGtv TvJ쨀t8>u1^G5t"wwT^G F tPf ð^GFPj TvjT^G"G*^wS lvZL^GFL*NGAu|"uSEr ^GJ1/^GAt ^G,^GBtG8$<t^G.^GFD*FuLVLLTN;Ot ^G <u^_^G*F|[tG:^"uG"vDHG>n^"uS^G rGtPQHWwTlFPwVF vB^u*Gu#^G"^"uG"G>S(L^GFD*F|[u-w8}a ^GvDjwA~}k^G[OZ:s;G[:u&^G"vD8G!D9ShTjTv(L^G<^G-^&GFF&_ ^GBFj j\jj\FFF;vQ^_0^GB;Ft5GT;Fw]GSv1&tGTGWtSf ^gW@^GVsGXt^G5t&>u v TF^OW ^F(GT^G*F t,"t&؋F9Gv)G^tvhI-T>uFr~vT<u/FPP*TȈFPT~uvjTvjLTvT<u*FPP*TȈFPT~uvjTL^G5 tFFtj j\jj\^&G^GBF~uG!F^G5tFF^G5tW#F^O5tW/F  P$Y h^G5t"~tF vT!ʲ k^G5 tK~uFF^!u'vT#F"t ~uTI/^WI%^W%F^G5@tW!$ FW/^_B^FG5tvhT^W-FG5Pt ЈFd^G5tFЈF쨀t@8^G5tn8^G5 t/FF^!unFsFFFvjTFsFF^GXuVFsFs F^GG^GGF^G*FOX#ʈND tDFF&Dt WX^uOX^gX^GX#"N;tFFvvT<uFs>vTuvjTvhLTvjvT<u vjT^_B^G5 tG6^GQ^_B^G5 tFG6 F^GQ^_B^G5 tFG7 F^GR^_B^G5 tG7^GR^GBFNsMD5@tT!$ W! ‹T/k^G5tvL!Q Y -^W/@^G5@tW!$vT!" W/^G5tW/ ^W/^GBFOX ɱuANG5~t(sW^GX@t ^W^W^G5tW1^G5 tv|!uW3F^G5t FЋW1_^G*FfG5$tvvtNtLDVHPwhv^wNwLGVHPwjG5$tvDVHW'W+M(&Gr&Gr&GsM(&Gs PhjPPFG5$tP66jwPh66jwj t 5uG5$tW'FF;Fv_FGGuwT GFuA2wTG@tBWv@8F뗸j j\jj\^GF tQPZ^G*F t>؋FGvt8a ^GvDjwA~}kv TvK TFFF;v^_0^F9GBt#u\Sv  ^G#G"ShLTvhT^G8vD!G9jTFFjdcFd^wT$GWGUSPTvjLTvjTFt.F;u ؉OLj j\jj\FFFuvTFFu`vTF@uQVF~w@FFFuvTFFuvTF@tvTFFuU^G5&tS$tW+^W)j,^W)j ^wTj^wTj^wTN^G5t(V'"jV'"jV' ^G5XtW/j ^W/ jd^wwTjd^wwTjdx^wwTjde^wwT^WK t^G5u& t^G8G9G:G;jTj ^G8G9G:PT]Uv],^u [tFF^Gt^.u^GF؍FPl&FFsF- ^GF܋^G[FފFՈFFvD!FFPlvta FPlvtj^؋G&F t@؊O wNQlv֊Lv֍tFPlv֍t FPlSj&n,FPl&FFF tW؋GF t؋G*F t.NQlv֍ta FPlv֍tj^؊G!FG&F t@؊O wNQlvԊLvԍtFPlvԍt FPlSj&n^GBFGXuSTF^2GVt FGVOWz^G5XtvTu vhLTvTЈF:u(^2GVt FGVOUOWv TF u#(^G5XtvTu vjLT^gWFFF;w.^_0^"u*uGWtS TsFuɰ^GBFSRPrF^NOD>D"8LUuDUG8D!G9VQTj\^WK t^UuGUM^OUShT^G8vD!G9>M(&EsDU$ ^GU^G:jTF t6K T^G"SZFGFFFȴ;FrgFGGuwTGFuC:wTG@uDwTv@AFuF~wFFuVFF~wFFuFv^uGt^wS lj j\F^GF|(u\(^_(^?t7^FvDPTR;WRu;GPw(^GPWR^;WRu;GPw^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7j j\F^GFVuOz^GPWRFVFPl^FS^wHe^S^wJe^G_^S^wLe^G^FG\v;DNr rF t ^G^TueHWwVjGLPGTP^GG <t<u%^GV;GTtOOLWN8^^GHHЋ^!GTtg^OGLWNvDHGT^GT9GVvGV^GJvL_+gHF9DVv ފO sGV^GVv1tHG`>uwFFF;wc^_0^GBFG(F"tA uB"s O(G*D2^"t ^"u G"ST\Fu^GBFG!^ GW ^W ^WF ^WG ^WF^G*FG"GB\STPs /tvZ^G"N(u ^G\^G\G(G(v;D>t(D"^O uu GG^G"^GtG sHWPQwTl^_ .8BLV`jG&GGGG^G^GBuG/<t*uG0OWO/Ë/uG/_^G*FW)09 W+, W+ W"F W"FW)p W-2 W- W)0 ^GVW+ ^GVċ6T+w wNwLGVHPthM(&Gs PhjPPFP66jwP t 5uGFL*NيW^ WD! ˆGWW t 5u^G>WG$<uW"G(^G>W0^G\WG"n^"uS^GtG rPQHWwTlFPwVF v^u(Gu!^G"^"uG"G>ST\^GFD*F|[uOLaw$}j^G[OZ:s(G[:u^G"^G5vT\^G<^G- j j\F()sv$) uR؋ON t0NL*NNLOLaw$~}jvx6"FFF;v^_0^GB;t#uSv  ^G#G"G! WmW`WFF~ w.~t(^' t 5uFW$FW^' t 5uW^G>Ft )OWO/vZj j\FU^W^' t 5u^W{^W^' t 5u],^Gt^.t ^u[uFF^GF؍FPl&FFsF- ^GF܋^G[FފFՈFFv؊D!FGaFG\FG^FG_FG`FGjFFD&F t@؊O wNQlv֊Lv֍tFPlv֍t FPlSj&n^&GF&G&_ ^GBFj j\FFFF;v^_0^GT;Fv@FsYGSv1&tGTGB;tHSRPs7^GPFS$^GPSZF^2GPtSf  ^F(GT^G*F t$"t؋F9Gv)G^thIFt<>u0^/uO0u G/GW^/u O0uG/gj j\FU]U^GNv&GL&DGJ&DGH&D&D&D &D G &DG!&DGE&D w.w,h^&G$&W&&G)&G*]F^&vDN&OLL&WTJ&|HO|6&_ \EPDHdJP6^G,W.GNMtu(^JuHuLuSjvj|FF^GBFGNv&GL&DGJ&DGH&DG&D&D&D G &DG!&DGE&D w.w,h^&G$&W&&G)vDXt:&G*~E5Pt|&ta|HuZ|J tE^JuKA^GG^&G):^&G*v|&u&G)"^HuJu ^&G)^&G)F^&vDN&OLL&WTJ&|HO|6&_ \EPDHdJP6^G,W.GXtJ uSjG^JuFSj9^GNMtu1^9GJr HuSP^LuSjvj|FF ^GtSi ^G@t4^_^G*F^G\;FtF uj$v%^G@uG5rL^G\ uG/8^GF|>uGP^G\FvLBN^O@vDGwD G(^G tSv^uGuv|(u\(^_(^?t7^FvDPTR;WRu;GPw(^GPWRv;TRu;DPr^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7v^uGt%^G\ tPL^G\^wS l^GFG\FG tLLO_^F&ONF^&"sB_ uC"s D)^&^O.^u^[u G[GpS ^G t vD^)u^[tSh8^G[l^8G)u&^[uGp^G[:GZsG[؋^G΋^8G)uċv|[uDpЉG>W@GB^G`$F<u ShQ~u ^G,A~t~u ^G.+~u^ ^G[:GZrG-^G[^G<^uS^w_@B^Gp^G\FONF&TTD~&ML$O rD^G^&G^G uO^&G^G+ ;vO+^+u^G^O+v&t,F^G)^*ugG( t`FG*؋GPWRFV^w\jTL^?u ^G(-FF؋^GPWR;Vu;FsċF^G(^F^Gt^GFG\F~?FFsF- ^GF^G[FFFvD$FFD FÊD!FĊD@FŊOqNƍwr~F^Gr uGuFԊGtFՊGs$F֊Gv$^GwFԊGvFՊGuF֊GyOz F؋^GpFڂ^uFF^w^~۹^G& tF؊Ow~FPj?n*>,u ^ _0,)F Fء,G0F ^ G0;,uF^ G0F >:u,:^ ^&Gv  D &OL!D#&OL@;n&vD$^ G h&^G^ G$^ G4G O! G5GDHG6RPVw Qw@O>QRPVGPGPhsmc u8^ G h&^^ G! G@^XZ^^ GB^&u5rLF u ^&G*^&Gv\D&GDV ^GFF&D FGt5u1)u+OL:uظGG$W+G,G0a^#u^uq)ukq^G,t<u;^uZ)uT<G_$G$G+G,G0ЉG>W@GB0^,u)u<t<t<uvf ^G^Guy^Gunv&|td&L~M0&L N|>t҉GODBFGUW‰WGG$U W(G+G,G_@GB뇋^GuSL^&G+^G vDBFGD GG*G)SPTLFP؍GDP^G$Pc l u!^&w&&w$^wD^G,W.^GDG,G.^GDHG6GB t,FL t ND tF tS^GFv&DGH&DGD&DG &DG!&DG@&D&| &FP؍GDPFPc lF uvv^wD^G,W.^GDG,G.^GDHG6F ^ w>jPj FPjFPFPFPjhF t@~tA"NtA"r~uB~u~tFy/F^FGF^FGFGFGWFv ^uGt^wS l^_^GBFj j\^Gu r^(u FG(^_(^?t7^FvDPTR;WRu;GPw(^GPWR^;WRu;GPw^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7j P\^GFDBFG t'DtЉGPWRgG^G^VuOQ^GPWRFVFPl^FS^wDe^S^wFe^G_^S^wHe^G^FG\vDFO_+dDFvDtG_^G\^;GJsF t ^G^TuG@tr^Gt^GVGTG"^HWwVjGLPGTP^G^GDHЋ^#GTGT;GVug^OlnGLWNGVGT^F9GVvGV^GT9GVvGV^GVv1tDG`>ttF؋GBFFF;pwz^_0^G(F"tA uB"s O( tF^G*S-^"u)S^GOt sPPtlU졮 tGt7]jPZrj$j]^GBFD0tT2GL^W4FS^Gu%vL! W f^W4FW %^G! ^W @^W4FW F$PFt؋OBW*V"u6DtE t dP^ ^G>v;D\t^G" ^"uG"^"u7^G <u\u ^GN ^GN pGjho^"tGu+OjPZsG$ G^Gt"G sXuHW~PQwTl^_ .G-G5GPGtgvDHG8G:GtvvGtUv|"uL^G sB6t8W4tW&w8oO6G8O:G8O: ^G*FDXDFF&LNFG"^&G t &O tO8G:1G6 G66TtW v&DSTtW2v&DSTtW0v&DSTtW.v&DSTtW,v&DSTtW*v&DSTtW(v&STtW4v&D^G sD6t:W4tW&w8oO6G8O:G8O:F|"tgGW<0^GVHW>^GVHċW>WD^GVWFv^GVċWFWuˋGu r^G*FjjoGtxW4!upv|"ug6taW4t^G sW&w8oW&8mG6HG6O8W:O8W: tˋGtSTtGtW$W4G u&FFw*P&v@FuG tpG"GtuW W vvs vv^uvS^uGt|Gt gj^Gt"G r~PQGHOX+WJRPQl^G*6"uu jjo^G"^wS l>u2GtGF^G t%^G"<tA<tB <t@ FG tG"Gu@oFskW<0W>PY GG PGPG $t@ uAuB ʋv|L|V;uB "GG uFr=G7Gt G uG uG t\Gt)W  t 5uW vtyGu!W d t 5uW ӋW  t 5uW 묋G t FsG @u ^G,[G t ^G.GGt ^G-3Gt)G $<tGtv|"u G $<uGtDvD t:DFF&L tv&9D"vw~&}^Ol^_".4HVp^G"G>7^G\^G>볋^G"6D L G>SgG Gt vv L^G"^GbG)Gt ^G" vvsvvj$U^[uau6DGctd^_".7o,Ko,y,V^G[u jjo^G"G>Cj$^aHrGs ^Ga ^GZ8G[r?6|@uLts~ELtt u\u ^uRvv:^GD^;GVtG_6L:sG`:w"^G[G`vDDGVGHG8G:nGt.Ov*L_L`~eDDVtFG8-O:G8O:5FPG^*G_^gDPF v^G`vDDGV^GZ:G[tvu^G"GN GGu4^aHsXGr4^G"G>v vO^aHs$Gs^GavSJGt!;^GbvD"6DD tSQ4vvs vv]U^G[ObWauvD:O[O[tUGt ^Gc6"Dt_a^Gc6"Dt_a^G[;vvSh^GbGaG[FPwVF v^uGuGHG8G:^G"S]^_*^GbG[auG-3^GaG[6Du^Gc6"DtG`^G^^Gv t+Jt#Gtc^GbvD"6D!^bs56Du~E"GbD)S^G"Gv vv ]GO F^G@t$Gu GHFFO^GX~FN=@FHFPF^G@GLWNRH@PRVX%NFNYFFw$^N9ODv@^&0FFuԋ^G@uF@FHFPF^Gt0^_^GBFFPl?FFsF- ^GF^G[FFFFFvD FÊD!FFFPlvtf^GdF͋^GtFF^G@;GJs FF^G\FԊG^F֊G_F׊G`F؊GkFڊGeFۋ^GtF F^GcF܋^G&F tNQlvLvtFPlSj?n j j\tF؋_B^Gu r t Gt;^&G&gF;s@Fs F)tFFF;pv^GBFG*F t ؋F9Gv)G^tG]Sj^G t/^Gt(W  t 5u^W vtV^Gu$W$W d t 5u^W )^W$W  t 5u^W vh]  ^Gt gj^"uu jjo^G"G>^;ujjoLFrM(&GsF;t^GOFS,^GO2F@tuOOtd^G t[^W2^GL^GN ^W4^W4쨀td t 5uvvf ^G0FFt^&Gj P\FsvPPtlj j\v>t$j P\^GBFDt{9OHvL^GvTt^GL$OHI ^W2^W*^GFr^W,f^W.Z^W0N^W4STtF~0uw%F~w^W4쨀u FuFu԰U]^GBFOJv& WH&TWF&TWD&TWLҲuB&TWҲuB&T ؊W &TW!&TW@;&L s&T ^&G^GMv&D GN&D!w.w,h^&G$&W&^GBFv& OJ&LOH&LOF&LODDt OLSt$^Gt^&Gs ^OL^gL^Gu^&G s&Gv;DJsD@ ^GJG@^&G vDM~Eu &!rDN^&G!$^GN^GJgHPGDgFP6^G,W.`~`^ FGFGFGFw~ ^ G"FŠG#FÊG$FĊG%FŋG&FƋG,W.F̉V΋G2FҋG6F֋G8F؋G:FڋGu_FF;vN u5NM(&G s9FsGu*Fr ^ފGrFs^ފG$<@tFFF;Fr~tF uAM(&W ҋ؊GP$u@^" ZҲuB" "^ފOv:LtB"PTRWRQtt@Y"sFFe^ދG&Fڃ~tG t)_$ćdF֌Fv޸RP^֋^ދG&FM(&G sKF t!6(^ލOQOQ؍OQGP6(^ލGPGPRPj?FF tfNr ~u=t~uFFFFFVԍFNԋ^QOwFNQP^ފG PnF tB^މO&~t#6(^ލGPGPRPj?FFtFs M(&G r1>t*FF;w t NދGFuL^t+Ju/^&ćF֌F، t^GP^GP>u6FF;v% u N^&:D$t.Oqqqqq^&G^:G!t@V^&Gv:D!t@Fs@&G D>7F1^&Gv:D t@&O:L!tA"&O:L@tA"FҊFsX^ހOvt F^w^ލ F^ފ_$ćF֌F، tFt^&㋇f dtߡ t؉Fދ؋O0A`^ހOvt F^w^ލ F^&ćdF֌Fv^S^֋^ފ_$ćF֌F، tv^vrlF6hvbs%FsFUFPfSpFr>kuF[FT>YuMkFhG kDs6hvbFh tFFFkv7UYW[URrGfSUFPf&UP@ËFnXƇF]h]vRsF#UFFU^ع++NFFF+؍FȰ򪚃fFF^G^fhj^F&wjbrh7FfhUUFFs6\DPPUƇi\G7PG P\GyW{6DT DGWD ]RsF#f&FSF~tms]>YuU+;Nv WY[>Fu"Fs.>Yu'Fs >]uW]W@16SWN데UUUFu>fWFP6d8s4RrUSC^F؍Fn UF]ˠRsU#UFÃU>Urh7r]^ uR^G <t<uRh7^tFN؎&W&N>P&D&T SfOQf&QPlW]YUF sRRFV NPFSfOQf&QPlW]Y]UNP;Hu;FuW;Ju L;^t<LFP6P6N6W<P7NPFHWJ^L]UfhhZw@w>wB1jbrh7fhjwww1hbsh7>Yuh7WNP\GXWZ]FP6P6N6W7<F t LP7>]tYW;]tP tWSHWFP6P6N6W<P7FFP6P6N6W7<P7맡NPFHWJ^LUF;LuL] htSFWNPrˋ\GyW{FVG}WFVvv"P7\GyW{FVGoWqGw266vv, LZTP FF@FFF~uFP66v<P7FFFF;FrAr P 66v<P7vFPjFFsvvvN NtFHPFHPlFbvvv FrFTF^FP FF FFFs^v&uFPv ;F tFF=rJ66v <P7F@1vV66R<P7P F^v0~NFNFȉNƄv+N+^0^~9^YFF#F;vu;FuTF^FF66v <P7TP FF^FtpFFPv N ;tLFF=rQvv TP F^F~TNFFFƄTFFFFrOF HPFHPlF F ;Ft0FF F;FrظP vvhFFs>Ut4UPv F66P<P7vvhU~]F^v&tƃF=rh7ڋFU^GP^&Pvl]FF^ v&ttFN;v\p~^t+JYu>N+FN^ 0~^ 9^YF^ v&FFFF|+N^ v8 UQFhG$ FGGFF;ht؋FG$ FGG݋]UhGF;t DtyFnNh^^^^FF u~thG PFPFF\Gw;Fvm~ugF^& uFՋFtFNv\Pyx{&W&&W&FF&FF\w uGSFF<~u h7h7PF]UhFF t!tFN؎&VWP$ظPPF]UyDP7]UQPF u NrF]Uh& duh&G@&Gu\G%v,]Uh& duh&G@&Gu\G%v,]h&GFjFN~t^&G&GFF>huh&GF&t&Ou\O%h& ith7h&uXhGnG@t Fs(h&G \EW&GߊD sD \6h&D &T t <s 6hD hG \vshFFFN;wYN^&W fmtAT;nu6&;^u-T>hU|&W &G h&W &G D E FFsv$ hGPfSP7hGP\G7PP7DP7U=&tA=t@F=emt=pmuFrm~-mt@sFmmF=rmt =mmth7rsFl:ku >tmmh&G>kucrhtk<u:ju66L P7hmm6L  t@eh t6h&D Gjh;t@&G =dmt"m:u>mt &G G뷚7v;sFh&:G t'~mmt>muo7vh7v~mmue]UFh&G =mmuhG <t<t G uOhg]Uh&GhGjh;t&&G =dmt&GGѡ]~t2h&GF\ hFFhhFhv$ >thGPfShGP\GPF~uhGP\G7PFF t!h tP$6h5v7\GW6h&D>hE &| dt/} t)sM hgh&G mPU>uNrh7hhh& fth7h>hh&G ih_]h& fuh7h& duh&th7h&th76hhGPVhGPV\ h9_u'yhG;Xu8h&;Zu+Z#hGF^G;huhG^Gh&G f6hD&hV8FFsVFFF;whh&;Fu,&G u ~rmuF s jFFs &G &Ges &Ov^Sv &GFFPFN&OP^SvU=]>uFvFPjT#;RtAV#;tB"ʈN~uB sA>uv%P66Vv%Ph>tFr >uUvjy]Uvjy]6vvF u@>hu~u)4h&uj$~th&G =zmu hv7U] 6FPj~t>( rRFFF F ^&~ s&F t\OuG u~6\|&ttTrmu us\^G vQj^N&W & v&T&|&T&&L&D&D&D&D&DCA+&L ^ vP7pn\GQl\G\W^G`WbGdWf~t GXGZ#Y NP\GXWZF\GWhG7PnFFFF u~u}PFPF uFF\;Gwsp{py, FԂ~u>hth&G &W \\GSFFsFZGV\GSpFGUF2jF uF@\GUnGQvv u\GS2FhGF  tptj" ualFVFt \GdWfF%;tNtFV\G`Wbh&G &W \hFU6nj]UjP]Uhs2]v`F u"\GQ;nu\St w tFvUF u\GU;FtFUvUP7\GS tPGUP]F<t<uRZVu ZwV`F ux\QtiZ6\DSGVOXFVpZFFTp\GFFV>pu\G2*ȵx\GD *ȵxE\GGDGQ6ZLVOSGUfs.3\D Ћ\GoWqGwhF tP6ph|ˋZpGVGXFFu;Xu Z;^uhs jF~uTPZwPwNv<FZ~utl tiFp\9GtUFX^ZУTV\t-:t'hs jF>F>ktZk:juPZ t ؍ONG! \GFGF\GyG{6\D,T.GWD=ZGFG!FG>W@6\DyT{GB DW>kth t;h&;Zu.؋tFN~t؎&G&W;Vu;TuZGP\GDPFG F^ZXGWTV6\DyT{G G DWƄh7v\GPv\G7P\GoWqUTnp\GQGwk]FhFF>pt{lTZ;^th7TPZwPwN6p7<F tNr P6ph!|Fr#ZGT tTQwPwNpP7<FF tNrPZpGTPh!|F FFhGte"P7nF~t}F\F9GwvFVFۋ\GSF tPGUPP7묋htFN~t^&G&WFV&FFVUQv FPv vr P~ t\w{wySP]U\G7PFPhu*vfSP6hv+PvhFNhP]UfSv6h]U^uS"P7^G@u-vv\t2 P7]U"P76h\GlXZhGQFmF uSFNhn"F u2Fh~tn"F uFh2vv:P|]Un" u]ðT򪚓lTTPZwPwNP7<]U "P7nF\FFFn"F u>Fhn"F u F2Fn~uP7vv:P|]UQ#F\GXn u@~tA"s(n"ˋ]UQQ^uS^ tSFv+v]UQQnFFfs^F tWPFPP7FF\;Gws$p{pySP7F΋\GSFF뢋]U>hu48ku%8jtZGrh uMZhGr<5h&G$u@dk:lt@FPZrv]Uhn9GuuG :ktk:jsFrmv8]UQvsg&GP$ u@FYtA N>htB "Frh& zt@FFsP덋]Us2& thh&;FuݚP&v]Us$&;FuP&]UhFFFs4F;t&;Fu&G@tۚP&ËFFFh]UQQjFFN؎& zu P7^& mt P7^&t P7\Gns P7]U^tFN~t`^&G&W FFFHN;r,^&w&wQ<P7>t P7Fu^&F뚋]^ug^ S\GPF tP\G7P^G^QP\GDPY NP\GXWZ^ S?P^w\2jFFN؎&_^u\GXGZ/^&GF^G^QPP^w\^uG^S\GPh8s%^G^QP\GDPj8rshh7FnFF tLPvP7j^w( u^Sgt~t"P\GSFFh7jFFNjVV^&؎&;th7^Gn"P7v^ u#F t;Fuh7^&GFFFnF^SgF\GSF~tA uB"sNANPQP뽋Ft \@M:^SOFu(3PF^SOFuh7hFFF^SgFu)F@F\OSN t QPPh7ŋ\vHMhF F\GL<s1tȸ31F\OL31F^&;rFF\GLN;v,vP;VsxMu VVNFFFFă~uR\GL;FuDF\GLN;v F@PF@PFЋ\GLFGLFt"^Sf\@ P\v@MF\OLtR31FF\GLȴN;r/xMt"~Wf@Ph8sFFu\Ut "PFF\GFF\GE;Fu3F@FNFOSN t QP3PF\GEN;r&^^?u \GEFFuʋF^FG\GEhUt "P\Ut "P7Fvv(F u)F@F\OSN t QPPh7ŋ^\OEhUt "P7\EtXUuGF\FF\GEȴN;r+^^;FuG;FuFuøUQt P$< v !P$f.6x!(d⚙ۚa} v oh!P$]JVJO H A5 :V 3 , %9!P7 M(&GsO&rH^dw2؊|b=t"^`P^PRPPЀF]U>?uPPPFisbr P76KP7> v P7S6FP+ \P7F u P7F FVh tWRP PvvFPFPP]UQ>@u 6hPmmPPhG <t <t P76hP>@u]Ut P7PPPh u P7S6FP+ \P7P66h&GPFPP]UQ6hh t P76hP]UfgJg]U  S6S6P6$P76X7FZGVnn;tP`\GSnGF6n`\Ut P7\w uPЉFVFFw\FVFuۋ\GoWq;Vu;Fv P7\u P7\3OuIOD OuIODWOQPr P7P\GDPPr P7\wt2F\GwHN;rp{pygFuӚ\wt2F\GwHN;rp{py9FuӃ~u\GSZGV \GSFZOX\GGQGS2F tnP`F\GS2]UQQ&NWQP>ju&Gr P7atAQ=&t@PS6~pmu &O@]UQQ6W&GtSh tLG@uD=Fh&G;Fr hF&GhPFhFuӚ\ hO@P]U6hh uNhu P7hFPWPh u P76hvvS]UQ6hh t P7hFPWPhu P76hvP]U PrmPPhG <t <t P7t P7 FhtV^&T&|VN;s;v P7S^&w&wvvt<P7Sv@$P]UQQ6hF=pmt=rmurmP~pmu[&O@YhG@t P7RPP S6P6$P7h ub6,&g]Ut P76hh t P7"P76hFVhOyvv66QFDFhG$Gt6PS lF=u &Gv7v7]UFtv P7~u PmmPrmPP^. . K htFN؎GFFFRh&GFFF^F5hG t ^FN F^FFF&F9FvF>vNFYP]UFFFFtt P7PmmPPhG <t <t P7>nu 6h"P7^., 0 b ~s P7^&FPKP7F\GW+~ v P7^Sv\G7P+ \P7>nu P2PP]U6>tApt@ Pb]UQ &6hpFh&G mP8F S6[]U6h&G$ &]U6hs&G% &G% &G]U;)v P7!P7]U66]U>6rmPPP]F^&t5PFPF u+F ^&O ^S^GP^ F^ t,^FN&b&Ob^  t^QP^Sh8 ^&?u@FFsv Vv ^S ~`+F;|rF;bvNrd;bv Nr^~FNFNF;|sc^&GF& tBFO;th7^GvNvFYFFFFFF딋F|+~`+ȉb|FPV£|b++£bY^^GUv vQk:jw2k:ltv&f&fhkk]h S6S6vP$! P76X7ndmfhjkfF&Gs/hvhvvhvvhvv^tfQu+JVX*ȶ@tu!.ucsNFAQPjF@NF둊Fsjll^Ft*S^@P^HF >sh7Fv vQFF^FF^FF^FO\GF^FwDJNZ^F&@;w&Sv8[^FFk:jvhu v&vf&fhhG^FNF BF^&@;w¶Sv8^Fkin&kU~t*t t=Hu\rv7]F tV=r =wP$h t7>t&tA&9u@ FFFshv~u >uF~ut=IuF~uk:jsFF&GN=uD&!u9ar2r+>u sNFFs!&G&Gs v2FFs6XSdF Sl4~uC&G t at=&u,r&G=rmt =pmt=emu &!tl jurY&GFF&ON^&?{u'}u+JVF+HF@FFFjF&9GrU&HN&^FI&8*u;Ns+S^SQF;Fu^S^SPtuFuU^v]Uv & ~^Y]FF9Fvs^ &^&:t^ArZv ^ v& ^ v&,AaF^v&F P^S؎F&PttF P^S؎F&P$u^ &F^&;u^ S^SF@Pt;u^FF~t&FU^ v&7]U^v7]UF%u+Ju]UF ^GFG6Zt ^Sjn]\<t<uZG>W@ vv t@F\Ut "P\GoWqhFF FV\GwF tH@yP{ ZG>W@"P7~ s9vv u*F@\;Gwuv(;Vu;Fu8F@\;Gwu)vp{py, F\GwFF"P7FV\GoWqhF V hw FV;u;v{\Gw tHHyP{ FV+FVZ>\;u;w@FsN~vvFNV>;u;r+F~F Fu~t\wu~uF~u΋\GwHHyP{9Vu9FrGwh uGF?N~+׋6\h>F~u2)FV66RP, 2~t*"F u\GoWqhFFD~u FsF\UtopFvcF u\GShs,Zwbw`6 <F t P6ho|F~uFFø"F\GS;Ft'~u! uj$\wSGUPʋFFV FFFF;Fs~uv v P <FFދFUP7]UAvAZ9Odw],s1Zwbw`6 <F t=.t P6ho|Zwbw`P<F tP6ho|UFPX%VR £X %] FVZ)GlWn)66mF Ft5n^S㋇,Ћ!X@rʚá uZGjGhGfUF V N~>]FV FVv v mZGd;wj$F Ft96拇,uh7n^@rƚ\<tA n<t@  u"\$ tZGfGhGj 66mZGd;wZwdhlF FuZGd;Wnu;Glw@У\Gw6拇,#uw9u9v>@rヿu9u9wΡZGlWnP  X £9Vu9Fvx9u9w$ZGlWns @r06拇,#tgrm>t >tX tQ> >tGH\h>t)FVO>ta> r$3F t vh6V桨\@yP{X@Gwh;r\;u;sj r+\NNOO6\Vpy_y}NNOOc> r rH36\@yP{;u;rs;r\HyP{ uNFV;u;s 6\hFV+FVA\Owh tiP> r  u T3F t vh;u;vFV FVZGlWnv v mZ9GdwP\wh|F Ft6拇,tj6h|S6拇, n^X@r&u{ &w&7m46拇,u &Gˋ㋇,Ћ!Z)GlWn)&G&u &w&7&w&w, &uJn &w&wF &&WP7F&GP7&GUGh tz؋OnO^fhG kjlh&^\_&Zc=CPtA#;°t@ `h&G$u@d]FF;wHh9u(O;uN;tFhFhF FuUh>uh7hG+1]UGh68]Uv v h]F t4;w.^G":t<u^G;Fu K(َU>u G;rGsڋG;FuҰ]U>u G;rGsڰ]˰]UFF;w@sFFu۸]UF t!;wGr]FF;w)^tG;FuFGFu@Z\G8$sFF6\FPQ|F tRPP<F u>Uu\G$rFFFs>FFw.u FVFuFFFF8FrFˍFP6\|F tFF;Fv9 uAvvP<F tl t6\FPQ|F tˋZFÊFŊFƋFF=9|t=CPtM(&GseZ$u@FɸFႿuF#ZF9wANsFZF㊇F䊇FF$ZF[Zu.\GsFZGw$u@FɸFZvuF"ZGvF9wANsFZGuFGtFGxFGzF6M(&Dr [u@FˍFP6\|F tˋZG.W0FVRPj<F t˚l u]Z=9|t =CPttFZG.W0;Vu;Fu2GrˋF=-t\!uˋFFtFr lFV~v ZG:W<lZZw0w.j <F uFsZw4w2j <F~.uR6Zw0w.j< u7ZGrFGpF\G&ZZFGrFGpFUj9]<FF;w+^G&F t؋Or;NuGrFuU u% t!;v 33733%3 ҃+@sH]U؋]^w&w$6RP6^G4W6FVONQA6FRu+JV(FFG$W&_Y+׉GD+ȉOFG*;vGF^G*OF;wBVW ;Ȱu@"ˆFG% u@Fg{G*+IRP6RP6FV^;W.u;G,v^g^GtG uFs^G %=uFF6h6fFPFP^G,PG<PFFu+JB.!<Mv$/^G tFsSFPsvDvTFr ^Gu^G %GFs^G uSFPsv^G rSvx^G u Fr28v8]FszQv9^G u8uFsSFPCv #^OFrS{ F^G^GFVG*+GFF^GDGFFr?^W6h6fSj FPFPF uF;w ^GF^GF)F^GFVG*+GFF^G @s F;rR^GDGFFr@^W6h6fSj FPFPF=yuF;w ^GF^GF)F^G*+GFF^W6h6fSFPF=t ^F)G*F;v)F^OGFVFFFODOF;w &|WRjiFFFrKF^&O؉F^&FF;vu;FuF~uF뮸Pvh^G@PFPF! F tP$^OS^GFG:G8Gu G tS ^GtGDG@WBG0W2G^GFVG8OD;v+щW8v&G@GB^GDv&D&L G,O.^G tGFF&O؈OH>HuFHPHU^O ?utj$^Gu">>u> @FF@D">:uF: <FF<B]$^G sF F^G u"GF+G:GOFNЈFFV-^GF+G:GWFVGFNЉFV^GuG,FFFF^G0W2FVNFV^G8FFN^FPF t^GOwS l^G8)G:uOwS lL^G:G8;vO8^G@FDF& O@GBv&DG,G.;HuHvU^G GwS l]^G GtGDGFG:1V t+O:^GtsG:G8G@WBG0W2.^G8GFVv&DG,G.v&G@GB^GZGuO^O8^G$W&G4W6GFG:G8GtsGDG@WBG0W2G^GFVG8OD;v+щW8v&G@GB^GDv&D&L G,O.^G,GHGJS F t^gSF^?tj$^G> Gww >DtcDF>F~tN^^Gu G;Ft^ۋ^^ u@^D^OSF tA^tOwS lJ^^ u@F^FD^G%Gtg^GuGFO8؈OZ^uGt_^F&GvK^Gu GGGDGF;GXv,vq:^GX t"GFGFFOH&LGSd v^G^G rSY8FPwFF ^GtGFF&DGv^GU^Gt1%Gu t G^Gu GGS v^u SwFF ^G]^g:F^;Ft uj$^^ u<^B^G s^u5Gu-t wBw@F tP$^gv_^uGt Sw8F v6v^u%SwFF ^GtGFF&DG^GUv v ^S ]h ft9~u ЉFVFFFFF]^$ u "uG"ЉFVNNNAFu+JV(FFFFV6h6fFNQPFNQPvvFNQPF t =ztP$Uh fu ^&G=N Lt ^&G/)^&G sLNj ^Sl]FF>t}FF;wqF t[؃*uFOr?&t9FF(FF6h6fQNQPPFPFFF^*tFFu~uDFrL tPlУLN^&GxW^ Ssl^L&G t&^&WNىGQ A^G6u+JV¹NFތ;u;u/~FHsH6FRP l^SKl^_^FvDD D L\dNVL&&WL$T&L4T6L T"DDDFD*D(\^G8DZV tF>|t@Fs |F P(F ;PuFV TuFTVF RvFF;Pu4|s-|PTFF tУTV6R^jlFP t؊_$ć M(&Gs#&Gs쨀tFF t^vrlFM(&GsF@F'FsF F  ''F 'F ċ'F 'F 'M(&Gr&Gr&GsFFP'Xċ'M(&GsM(&GsT' F'FVv U'']U졮' ']F'*'^'^@'^'^vF>}t@FsF }*XF\^X@%X;Zuj$vFFF:}Pu1}Z9Xt*ć\FFZ@%Zv^j$vn^ F HF F'Fs' ' 'F 'F ċ'F 'F 'M(&Gs.F'$u@'T' D Fs3V#M(&GsFP'Xċ''FVv U'']U졜' ']F'PZ@^'PY^vU] >dt>bt6FPld6FPlF FuT~u v ^& u S uP ^& u S ^&G;uFFP ^& uS4^& u S ^&G  u+Ju ^&G^S Ft^&GSl^Gt tn\^G@t S Fo^G%_GtS *^G tS ^GtS ^GF^G u~u S_ F^G uS ^&G tF_$ďNF^S^ ^SFP ^&G u`&GF=rmu ^&g'~pmu ^&O@6^SdPtl-^&FjFN؎&G r^g^SlT^&t 6S l/&!u^& %u6XSdF ^Sl>u ^Sl)^&GF&G FF: t/FF t%ONF&L;NuO F^у>>tW>F^F tEONF&L;NuۋF^G^ u@^Dv 미FFF;vF tB؋G*F t/F t(ONF&L;NuO F^Fы^(tdtOFF;dwA6FPl^&G;Ft 6S lF^&GSldFu6RP l6FPlF tV~tE& t<&G;u2FF؋O@u! uONF&L;Nu WF6^S6~RP l6~FPlF Ft5FFظ GuONF&L;Nu GF6~^SL t%&O;NuF&GSlУLNF^&GS{ M(&Gs_&sFFFA^Gu+JVPNQRPjPЀF^G sPXONF&LNF~t5 uFFF HFjFPjjjQЀF^#uG6~S l!^GFFތ;u;u S^G uG^&GSl_6RP l6FPlF t8^&O&;Lu^G^&GSl^&O^S{ v 2v&| W &^F^&F^&tNF<v#F<u^&wFPj~v}^&G&WFډVFFtb&G ;wQF^&G P^XP% u@FXP%@ u@FX%?v&D Ĵ;G2uM^SFP F u8^&FjFN&4FFs^Gu^G$<tFrO^OFP% u@FX%@ u@FЃ~t,^&GtP$ u@FX$u@Ff?FsL^@GuB^ tG u6^&t-Gr&rGu^ tG usFFt(^G$<tt<t<t <t<t< u.F<v!^&GFF t&Fڋ^G6tu^&Gse^&u{^&G^G6tF<u(^&Gs0|Fu^&GH&GFs_Fr^#u,~Fty^G$<\t< u^& ut|h fun^& uuB^&uU^Gu#vT uruu r! F u6^S t/dy^GFG FG FGFGGFsOFs^O^F GM(&GsFFFFAFu+JVjFPjjjQЀFFtv  tFt ^& uuJ@^Gu>^ tG u2r+^&t"Gu^ tG us^OFu^&G^GG^&G&W^GWFڋV܋^G W"v&DG(Fr vD8GZv_  tv ^&G F&wFPj~u F%`;Ru3F%;u'^&wF%PhvD^F~u>^&F tjFFN؎& zu^&uj$^FGLWN)GTGX6M(&Dr uFF^G$W& FVFF Ft n^FVFHFFA^Gu+JVjFNPQjjjQЀF^ uFF^GV HFjFNPQjjjQЀF^GuxFG W"G$W&)G()G*G tGW^FGOG`HOJGO^_^F&GFF t؋F&^G$W&GPWRG*^FG4W6)G8GtG0W2b^F)G:8tG,O.GHOJG,O.?^G: t5O@NF&W@GBv&LOHGJO,G.G8;vO8^G4W6GPWRG8GV^(uBv ^G u0h ft^GFO$t tPv  ^G u<u^G W"G$W&G(^G W"FV_ ^Gt O#^tFN~t|^&G&W;Vu;Fw)FV^&F^&G&WN~׋vD$T&&G&W+׋L(;u;vL*^&G&W+FV^G*^g6~RP l6~FPlF Ft v  ^G@tG[GGXGT&\^GtdO4W6OPWRO8OVtg^O@G,GHGJ^Gu^G0W2GLWNGth(^Gj^G$W&GPWRG*GVG t-G% GGWGLWNGFF&O؈O!^G% @GGGHGJGLGN^GF_$ďNF u ؉O^O S^M(&Gs j j\FF tP^r1FF tP^drFF t^M(&Gs j j\F u^bFU^?tj$^b]^G*F t O*FDtV l֋^G(F t O(FDtV lU^GrG6S l]h ftA^G@u'S^G <u1u+SwV" F ^O^gwb^G^uGt^wS l;^_^G(F^ tFF^^*t vj<^VuO ^GFOPWR;T.u;L,rG^G(F*tA uB"s/G* O(FrSƋ^O@wS l0^G*Fҋك|PDR##ЉL4T6NVQA6Ru+JV(FF_X+ߋ^҉wD+ƉGFOV;vOFV6h6fFNQPj^ҍG,PG<PF t=yt^ҋG tsF F^G@tGHF،FڸЈF׉F܉V$ЉF؉Vڋ^ҋGLWNF܉VފGF׀N^ҋG,GDO.FNFFGFFFN^FPF t26h6f^w>w<PPTFЋ^!G~u ^G tF^҉GwS l^G*h6h6f^w>w<PPT^G uSwFF v^GFu GuP^G*^wS lvhF t/&Ov L!D$ щL,T.D6&G D> L L^ gߋG>FS&&^ rS %^ G"GPGPGPGP FU^G v&DG!&D&Dw.w,P^&G$&W&]U^&w&&w$h^G,W.]M(&G r6(\GPGPRPj?Ptl6(\GPGP^GP^&P?F t/6(\GPGPZGPGP?FF\&uh7~  S6RPPjP$P7> vh7t F F~FPsh7FPP7Zv h9F tZGPFv7hGPFPPtlZGr th؍GPFPPtl6^\G&Z u S ˋ\%tj$\G&Zwp,ZM(&G s'6(\GPGPRPj?Ptl\_$ćFF t6\^6\  \&tˋl\%tˋ\rˋ\G$s0Sj|F=uFFFs\Sj|FF tP\$uFFsSj\Sj|FF tFs \Sj\Sj|F~tZ؍GPsFF;vZtZ^Gp6\\&D#>M(&E sH6(DPDPGPGP?F t"ZZ\G&)\_$ćFF t6\^FFt/ sFPlFFFPlSLF uXFF0FFFFFFF FFFFFFFPlSlvFPlSlFFF;w.^tGPvjsFuɰj$^tG uFG LNيW UW UT$ t\]EU$M@u|" | tT&H^Ww$jG PG&PF tP$s^G&^G$;G&ug?^OGG8G:vLDOGG W"G$G&^G W"vD T"G&D&^GGCvPD(^@uVFNFNQFp^G^H NF HNHP t$N䀀N @PRRֈVYNPĈFXFY^OBs >v ^>vFY^G8vD)O6jj$)^E(^CO0w1n^E ^G FOj PZr^G% G%3 t@Fs^Ot8WWw$lFP^w"w w&PP^G&P?XċAGuE^?uE ^E^O@h&^Gt uS$j PZj U^(uG(G)E^?AE]^. tG(G) G0OF^O1":t8Gt4^G1$GW ´@ZFDFG ts^Gt3^G F^ t;Fu^v^G(G)^GvDDG W"D T"G$D$G&D&^G F uS+$m^1u:^uG^G t vD8G*9^G$v+D$GjNQjNQPFPFPFPjhF u<~u6FϴV+Ѓ r"FNϵF؋G PY͵ FF^w>jFPjFPj$FPFPFPjhF uV~uPFϴV+Ѓr^GtS^ u  ^uSvQ^Ot  g^RB2 ZRZRZRZRZR ZR ZRа ZRZ tS^G t{F9G u O ^?uvDtS,^G^Gu^G^Gt'vDt u )uGFPw L^GGg, ^G uS,UR^ GuƇ^Ƈ^<^D^^gShLv L]^ t G GG^O2¿&u+JWuh|$^GH<t шVF^R ZR ZR ZRZR)ZF^GH<t шVF^G FG( uG) W^vD GF]GDDG$D$G W"D T"G&D&G(D)GtފG(@)G(-^OtG(y)^G(^R ZR ZRZR)ZFF^?uJ^ u+ t쨀ut  usF;VtjF붋^ tt  u>^ t쨀ut  uF;TtF뛋^  RBZ gF PZ @PZ ‰vR ZPY ^$u $9^G@u2?u*RZ P$YFO+ȋWOWG$(^?u*F t!O N t~GtuG8W:G8W:g^G&+Ft5O N t+Dt"W\8SPl^FG8O:G8O:^GNWGW)O$O W")O&^gF?tA uB"scRB ZG$;FsF^Nl^GNWGW)O$G&;sF^FG W")G&^ tRB2 Z^RF"ɱuANVRP_ZR8ZRB0 ZRF$^Zփ ^G F.  ) u b ~u v^Gtt4^$t;^G@uFv΃~t‹^Gu uG뫋^$u vDS뚋^G@tSvt낋^RZRBZ^O+w,n눋^ tPRB(Zu $^ DOFr Svqs^럋^B(G(<vlF^(t?Sv7s4^(u  @^G(v+@)O(F븋^G)":uTNIw*)C^(uG)^G(^ @Fr Svs^G)^G)":t{^G)<t< u ^Oc^) ugS^w)t+Ju3(u ^w1t+Ju O ^(t @G(^B(vvs^ u G8A^u $^R G8G(G)OZFF됋^B(vvks^ t5u $^ G(G) G0O^Gt FvFF^ u) u~uF@F;XuS, F;ZvZ^$ t@U^G(G)R $Z ]^u  ^^B^$t*F^F(uF@F;\uS,F u^G$=sFFFs"^RZwNn2^u  ^Nwo^GNWGW)O$8 ^u  ^^B^$t:FF^F0u*F@FNAN;\uڃu S,FFu^F uF^G$;FsFFs^RZNl/^u  ^Nm^GNWGW)O$^&u&Ww$jG PG&PF tP$^?u(^r!G FDt|8WWw&lF^  ?u  ^ ^G "PPX G&HPXXNjv ?u  ^^R#ZBOD ^O0@1G0FO1":t8Gt6^G1$GW ´@ZFDFG ts^Gt3^G F^ t;Fu^v^G(G)^GvDDG$D$G W"D T"G&D&^G F uS[m^1u:^uG^G t vD8G*9^G$v+D$G^’^žtSPPP 4v4FtR^ F tS 48Ft v4(Ft v 4Ft v? 4v 4Fth^jSp P4^’^.\pzv` 4`v4V^ Dv4:vh40v4&vhv4vj4vC4Ft&^R’Zh쨀uS)4vC4jFP؋žPœP4!^R ZR Z’G uƇ ^FFw1Ȱ^u  Ѱ^ VFuNj^<^D^^gߋ^žtSPPP 4֋^œt;›FH t׉N@ N G vw F^F9rSPhh 4FuF^F9r(RZRšZ ~ nFű^šS L^RhZRbZ‡$S4^$R ZR$Z’bjSžPœP4^FF^F9rPRZt6v@ t,FDtSC4vvhh 4Fu^RFZ‡$S4^R ZR$$ZR’ZRbZF;w SPhh 4^‡# $S4^F@u SC4^R Z’Fu Sj"4]F$uFF;w}^G$<t< t <t<t<uQ^G :FuFG!:Fu>@u8G&F t ^!u^GF^G^G"F^G!FFtzRPQvvQ^SRPQ^Svh-mcF t~ư$vPVQjNQj$NQNQRQPhF uK~uEFˆFF~uFF ;FsFv~ NN FȋVN V^&)F vfF~ tFt{ 6~&FPl^& u SDL^&G;~&u vL^&G \u+JuFv&t V &^F^&FĴ.^SLp^Sv La^Sv LR^Sv LC^Sv L4^SvL%^SvL^S L ^SLLFFt# ^&GSl^&G&gFFF;n&vNNh&^wXj\^G tFGt FFuF@^ZNOOuINtLXZ^G tˉF؋F9Gv)G빋^tGFOGvD \ 됊FsFs FPFP^wXj\Ft ^&GF t7&t. w & &^ w&FpM(&G sOVFNFNV^V^j QPjSR.lPtl~(Nu+JV tu&&˷F&6(&P&PRPj?F ^GB uFDFd<ߋG&F t ^!u^GF^%^G!F^=CPt #;u^O< v& ^=F^&P +ȋ^^x>^GFFG t6&|& |t O+&;Lv ^G'^O+w,^&^&GFF t ^O<&^&G$FF t ^O)&^G uG^&GSlvL6&RP l6&FPlFԌ t^&O&;Lu^G^&GSl^&O^SLt^Sl0^&_S^&wc LF uu^&G$FF u {^&^&G ;n&v_^&G h&^v&| u Guw^&G <wv:Du_^&vP^& vA^&-mt@Fs&Gpm^& t&G=pmt=smt^&xmtF^& uvD^&G & GFv^@ZF u LF u~!vF^@ZF^FF tGtFދ^^G+Ftv&D Sh&[G&D F~^&9O"w=A^G~ҹ t+Jt^&_S^&wjFPD \^G=:Fuw>~ҹ t+Jt^&_S^&wjFPD \^G=:FuCw>~ҹ t+J%^G=v&;DuO>Q&|WPtt*^&O"&w~FoL^& u}^&%j&F^ G\^&OL&pmuD^& uvL&G D *^GuFs ^&G ^&G ^G ^Gu$~u&~u ^G F^G ~uM(&G rtF^&8{u }Nu+JBV)VuK^v&8[uvN&8]uFn&N;u^vP&PQtu^SFPvLF uk^t]^GFSL^uBG<u?uuuv!^?ut j$^uSL^SFPvLF t ~^&GF;vN^& du^G $@t@FGFLND ًPG@v&D.GBG*G)SF% u@PTL^&G t^&O^&GFF t&^&G$FF t&^&G* t^&O.^SFPvLF u*^_^_^G@tG^&GtX^wXj\^GF t؋F3GtF^O~urLF u^wXj\/IF^GG~&ONO OvL ONOwL O(&L tOGv&DG$F%^ GGv&L*O>G@v&L.OBG)uS#N ɰu@PTL^G0FG/FG.FFG)G$N~+^PG HxX;Vu;Fs ^G)^G$N~;u;vO$^G^G^G F^ uF^FP^wXj\^&G t^&O^SFPvLF t^_^_^wXj\^u(^& uFh^GFG GFR^&GFF^O & _^v&D& Dt G+&;DvF'^O+w,^&^wXj\F^SFPvLF uC^&Gr3^_^_^wXj\FP^wXj\^&_S^&wc LF u=^&O&򪠨&^&;Gv'&^&&^&t 6&S l:^& ru SL&&!u^& %u6XSdF ^&GF&G FFFFF;n&vh&^wXj\F@^ZNOOuINuMXZ^NFF t؋O;NuGF^F߃~t^GFF t1ONF&L;NuO;~&uO FN^Ń~t^GF^ t6FONF&L;Nuۋ^vF^^OTN~t^G F^ tFONF&L;Nuۋ^ Fu+JtF؋O;~&u"O F^vF^^OVN늋^wXj\FtOF tPF؋NFG_^GHGuj$^G;~&uSL븋^wS l6~&RP l6~&FPlF tH& t4&G;~&u*FFظ GuONF&L;Nu GF6~&^S뜋F^&GSL^&GFFF;n&vh&FF@^ZNOOuINu@ZFF^F t$F؋O;NuuPLj$Ћ^uG<u?uuuv!^?ut j$^uSLNFt(^^ &G F tgF%;u[F%F;p&wLFj&F؊W u3v &|G;u%&| ft""Ұt@N ɱtA2s&^GF t ^u F^ ^G_^G_^_^wXj\^G t`WB tYGOOGW$G&G W"O+,|^9GBw^GBG0^O vD \ r^tEvDu;G<u5D F^ u^O<@GvF O^OTGV^_^Gu^OV^uSL#^GHGuj$^wS l^G F^ uF@^ZNOOuINt8HZNT tD<uÀL<@~VDOTGV^OF@^ZNOOuINtXZ^G tPv L^g ^GFONT VF tgD |&DFFيW &^&G& GtيG+&;Gv ^&G'^O+w,^&^Sld&F u$^d&^&L^G@FU^?tj$d&^d&^&]b&F t؋b&\&JF^GFG<tW W V^G  G Fv^@Z;Ftj$v^@Zb&^b&\&f&F t ^Guˋ^f&`&F+j&1 ^GFF^;FtF^^^GHGuG^^Gf&f&`&UfFVv ~VN$0$0:u u ъV ֹuu ׸]u u3]85Fvj$~rA6h>v h& mu@Fك>u&G$t@ Fًh9GuAN؀ tAN֡u+JtAN׃~uUNs t th tuFt^NrWNsHt u>>Zu?5Fr6Fs/Fs>t!Fr>u 6hhFs "P7&>vP^.msFFF> u.$+29Qv#vF^{FVFWFhFs!\GWr&GuhF7\G7FrF\kF`dFo]FFFsLF7E>ZuhZ^^FF! \^^F`FtFF@h6FPjF u?^ɷ.F^ G FFFF tPF rЉFVF>r[hG $ôFsNsN Fs\G$ô F>r  F&S F&ЉFVF9r&OɱuAhW@ҲuB " &dFFX \ЉFVFAЉFVF>r) &6&DtP$ Z"  &Ft\F^v6l> vFYN;r j +Pl v8Ȱˋ.. ..2.F[jV &7KPbljWjs S6\G7P+ \&Yj\j`jhG$ G>joj5>n r\wu,jhhOqh6j@lPn]>uX G8P &G7P\G7P+ \P7jVjj\jjojhyj;hjhj@h&>u &th&\Gnsh7&G$6 &<uA &G>sh& &\^jU>th&&G$$ &G6 &s &O &s &O F6&blFrFsjFso tYtT\w7Z! h9PblZGrh tj\_$ćFF u6\^ˊFsFr2ˡ`t6%Ph 6y>u>>#sj'6FYr;rt &G%$ &G&jFN~t`&&W ~U&W U &W&T&W&T &WU &W&D&G&GE&G &G&G#Fڃ~th^G^F܉Nދ؎&Fڋ&;wAv& ~ڍy%^Y^&F@F&G#^&GF`t &6G&UN;s)v+Pl v0\~9F&]UF;th6 \~9NF&]> F6%Ph>u~sj'&jFN~t^G &~u^&F^&uFF~tg^㋇&FvL^NV& @~;w)Q+&Wl v8vFYF^&GF듋^㋇&Fv^O@;Fvˋ^GPvF+&Pl^w ~9 ~ u~ 6~v~N F r7F tFPv `"F tFPv  FPv kPPFPj ^^& U^ Sv 6d^SD \] ~ u ~ _~ vW`s,F ;r;u^ &G u^ Sv ^S \!^v N FYF ^& F<tj$.AKmCt \Fa1{\%thPbl˰>tJ^^9r<\ t%؊OsG#F{F\G^u4\&uh t uhhQlZ>S6j!>\&th\S6|R/>u\SS6\SS6|FFF S6S66P$F9XuPF&G~&&^&^&GF& GlthF;(s\&GjK8^\G&Z u/t6O{O{uG{M(&G sZG{&0ZG{XM(&G s-Z$uƇR&0ZZ$uƇZ RF6FPjF~t˃>thPs &tP &Gti &Gtv &G t & u&tBh fth/ &w &wP F tP&Gt hs&GM(&O&"O% t@" &G&W fh&GТRPPPRQPPfPF &GP &Gt& &Gt& &Gt& &9Gt@9t:FF;w,F t؊Or 6 &LO8Fu &G&WutZ\ &u&Gjlˡ%;(s#666 S6SD&q\SFPQ|F tP>+9w>v\&th~++9w6~FFP\S|F uh fuAM(&G s&r S6S6RPRPjFPx u[vvP  u &GtvvyF&GFVfhj)jFP/|F tfh^&&W\&uhR &\&uhs?&wFPj~u& tңhh&;^uh!븡wdr_Zt$O{NG{h9F tCZNO{,ZFh9F tZNPh Ubrh]6V &^FF^&@uF S6Svj6$PblX=tPblUF;Fvj F+FPl^v8Ȱ]U&>\t0]^^9r\&^uݠ&]U\$u?GXt8GVs1G@&;t&@;t!O@&&GW  GW{ t@]ð]UD&&K(&&&~u&F&&&&QP&P uY& RPRPRP<&& RPPRP<&]6G69Gw6GUvF~ F ;uV^ :t3]Uv<\DD&]&E؉?G]Uv ~D&}u!&&EM(& v ~tf3ɋNfff N] j$UVfff]UV fFf]hLjFP/|P7^&&G)6 j P7fFFPP..U3ҋF vȋFv]UFf؋ʋF fЋ]UFf]UFV v]UFV v]Uv&D3v&D&v&]UF%]U ]UP$]U ]U>r)u((PPFP/|F^&^F>r)6r)SdPbl4]+ LIBRARY: Clstr.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:49) LIBRARY: Init.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:51) LIBRARY: FileSys.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:46) LIBRARY: OS.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:47) Clstr.Lib(SegOrder_P) Init.Lib(InitFs InitCMD InitNEC765C InitScsi InitScsi_53C94 InitScsi_6260 InitScsi_7770 InitScsi_ISK InitSeqCode_7770 InitWD2010 InitWD2797 InitWrapped) Fs_Srp.Obj OsLabl.obj OsLabl2.obj FileSys.Lib(BigMath ExpandSpecs FileLog FilePros_FS FsIo FsPeriodic Floppy_Nec765C Floppy2_Nec765C Floppy_Wd2797 Geometry_Nec765C HDisk_SCSI HDisk_WD2010 HfsDcb HfsDir HfsFab HfsFcb HfsFh HfsFhb HfsFile HfsLink HfsMain HfsNmb HfsPath HfsProcs HfsRun HfsUfb2 HfsVhb Lq_DWord_BSAC MassCache_L MassDma_N MassIo MDisk_CMD Mount OsSubset_FS ScsiDriver_53C94 ScsiDriver_6260 ScsiDriver_7770 ScsiDriver_ISK ScsiInfo ScsiManager ScsiUtil_ISK Status_FS Volume ) OS.Lib(CommonSubs_FS CompatSubs_FS Data_FS DWordIo EntryPoint Math32 MulParUtil_FS SrpDmy_WS Vdm1Dmy) ;******************************* MODULE HEADER *******************************; ;* *; ;* FILE: Fs_Srp.asm *; ;* *; ;* MACHINE: B20 LANGUAGE: ASSEMBLER OS: CTOS *; ;* *; ;* DESCRIPTION:  *; ;* *; ;* Parameters for a multi-processor protected-mode file system. *; ;* *; ;* *; ;* HISTORY: *; ;*  *; ;* MM/DD/YY VVVV/MM PROGRAMMER / DESCRIPTION OF CHANGE (Most recent first) *; ;* *; ;* *; ;* TITLE: CTOS SYSTEM SOFTWARE *; ;* *; ;* PROPRIETARY PROGRAM MATERIAL *; ;*  *; ;* THIS MATERIAL IS PROPRIETARY TO UNISYS CORPORATION AND IS NOT TO BE *; ;* REPRODUCED, USED OR DISCLOSED EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE *; ;* OR UPON WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF UNISYS *; ;* CORPORATION, DETROIT, MICHIGAN 48232, USA. *; ;* *; ;* COPYRIGHT (C) 1980, 1990 CONVERGENT INCORPORATED. ALL RIGHTS RESERVED *; ;* COPYRIGHT (C) 1980, 1990 UNISYS CORPORATION. ALL RIGHTS RESERVED *; ;* ************************************************************************* *; ;* *; ;* UNISYS BELIEVES THAT THE SOFTWARE FURNISHED HEREWITH IS ACCURATE AND *; ;* RELIABLE, AND MUCH CARE HAS BEEN TAKEN IN ITS PREPARATION. HOWEVER, *; ;* NO RESPONSIBILITY, FINANCIAL OR OTHERWISE, CAN BE ACCEPTED FOR ANY *; $ ;* CONSEQUENCES ARISING OUT OF THE USE OF THIS MATERIAL, INCLUDING LOSS OF *; ;* PROFIT, INDIRECT, SPECIAL, OR CONSEQUENTIAL DAMAGES, THERE ARE NO *; ;* WARRANTIES WHICH EXTEND BEYOND THE PROGRAM SPECIFICATION. *; ;* *; ;* THE CUSTOMER SHOULD EXERCISE CARE TO ASSURE THAT USE OF THE SOFTWARE *; ;* WILL BE IN FULL COMPLIANCE WITH LAWS, RULES AND REGULATIONS OF THE *; ;* JURISDICTIONS WITH RESPECT TO WHICH IT IS USED. *; ;* *; ;* *; ;*************************** END OF MODULE HEADER ****************************; ; $INCLUDE(Sysgen_Common.Mdf) %Begin EVEN ; MASS IO DEVICE CLASSES ; ; The SysGen must describe the initialization procedures to be used ; for different classes of hardware devices and interfaces. At boot ; time, the hardware is examined and each time a mass storage device ; is encountered, the array 'rgMassIoInit' is used to vector an ; initialization request to the hardware-specific procedure for the ; device class. ; ; NOTE: The MassIoInit macro MUST be invoked in ascending ; device class order, with no gaps left in the ; sequence. If a particular hardware class cannot ; be present on a system, the special entry name ; "Dummy" MUST BE USED as a place holder to generate ; the array correctly. %MassIoInit(InitWD2010) ;Device class 0: ST-506 disks %MassIoInit(InitWD2797) ;Device class 1: Floppy disks %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(InitNEC765C) ;Device class 5: Floppy disks %MassIoInit(InitISK) ;Device class 6: CT ISK Gate Array %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(Dummy) %MassIoInit(InitCMD) ;Device class 10: Cache Memory Device %MassIoInit(Dummy) %MassIoInit(InitNCR53C94) ;Device class 12: SuperGen SCSI %MassIoInit(Dummy)  %MassIoInit(InitAIC6260) ;Device class 14: PC/AT Adaptec 6260 SCSI %MassIoInit(Dummy) %MassIoInit(InitAIC7770) ;Device class 16: PC/AT Adaptec 7770 SCSI %MassIoInit(Dummy) %MassIoInit(Dummy) ;Device class 18: Nonexistent (config error) %MassIoDone ;############################################################### ; ; Space occupied by the tables below this location will be ; recalimed by the OS after its initialization ; ; ANY RE-ORDERING OF THIS FILE MUST NOT CROSS THIS BOUNDRY !!! ; ; CTOS has been carefully constructed so that the various parts ; of CTOS reside either before this boundry (resident code and ; data) or after (initialization code and data). There are ; five segments which are used in controlling this: ; ; "code" ... anything in this segment will be resident ; "const" .. anything in this segment will be resident ; "data" ... anything in this segment will be resident if ; the module is linked before SysGen.Obj, or ; non resident if linked after ; "stack" .. anything in this segment will be nonresident ; "coed" ... anything in this segment will be non ; resident (ie discarded after intialization) ; ; The CTOS processes are allocated stacks out of memory ; reserved by the following macro call, and the stack segment ; is used only for a stack during CTOS initialization. ; ; The following macro is invoked with one argument, the number ; of bytes to be reserved for CTOS to use to build its ; structures, tables, and to allocate the stacks for the ; different processes (declared later in this file). The macro ; variable sOsData may be defined in the prefix file if ; desired. The OS will crash with as error 101 if this value ; is too small. ;################################################################ %ResidentDataBoundry(52700) EVEN ;############################################################### ; ; Table which describes the CTOS resident processes. Each ; process is described by 4 attributes: ; ; 1. Process entry point ;  2. Size of its stack ; 3. priority (0 is highest, 254 lowest) ; 4. default exchange (0 if not required, <> 0 allocs next available) ; 5. optional "check proc" name; if supplied (non-0), proc is called ; to decide if the process should be created ; ; Stack size -- ; The stack size for a CTOS process must be large enough ; for the largest local variable and procedure call sequence. ; ;############################################################### %OsProcDesc(FileSystem, 656, 6, %TRUE, 0) %OsProcDesc(MassIo, 1800, 10, %TRUE, 0) %OsProcDesc(ScsiManager, 1280, 10, %FALSE, CheckForScsiHardware) EVEN ;############################################################### ; CTOS INITIALIZATION -- ; The following macros generate three tables of pointers which ; are used by FileSys during its initialization phase. All of the ; routines pointed to in these tables reside in modules which ; are linked near the start of the image, and the code for these ; modules is discarded after initialization is complete. These ; routines should have their code segments named "coed", and ; should use "data" for the name of their data segments. This ; is to insure that the Linker will place the code and data at ; the start of the run file, before the "ResidentDataBoundry" ; mentioned earlier in this file. The routines should obey the ; Convergent programming conventions related to register usage ; (refer to The Assembly Language Manual). The routines are ; executed at one of three times during initialization: ; ; InitProcHardware ; First after booted. This is the place to put hardware ; test and verification routines. ; ; InitProcIntDisable ; After structures have been initialized but before ; any processes have been started. This is the place to ; put hardware inititialization routines. ; ; InitProcIntEnable ; After interrupts are enabled these routines are executed ; as if they were a user program. (CTOS processes are running). ; This is the place to put initialization routines. ; ; The routines are called in the order given, with no arguments, as ; subroutines using the Assembly Language indirect far call instruction. ; %InitProcHardware(InitFsDataStructures) %InitProcHardware(InitSysConfig) %InitProcIntDisable(InitFsHardware) %InitProcIntEnable(InitFsMountDevices) %InitProcIntEnable(InitFsSysDevNum) %InitProcIntEnable(InitFsSystemTime) %InitProcIntEnable(InitFsFinish) EVEN ;############################################################### ; System common subroutine definitions ; The macro takes number, name and procedural interface for each routine ; to be installed. ; ;################################################################ %'SystemCommon(5, "StringsEqual", "") %SystemCommon(158, "UpdateFsDeviceName", "") EVEN ;############################################################### ; Interrupt routine definitions ; The macro takes device type, name, fDevice and fRaw for each routine ; to be installed. ; ;################################################################ %'Interrupt(tyRS4221, "SigIsr", TRUE, TRUE) EVEN ;############################################################### ; RTC initialization ; Externally defined RTC blocks may be initialized at installation ; using the RtcRq macro. ; Arguments are ; public name, timeInterval, resetValue, cEvents, exchange, rqCode. ; ;################################################################ %RtcRq(rqTimeAvr,10,10,2,0,0)%' for PC Auto-mount polling %RtcRq(trbFsPeriodic,10,10,2,16,0)%' for Fs Periodic (cache cleaning) EVEN ;################################################################ ; File system miscellaneous data structures ; Change these setting as needed ; %SET(nDisk, 16) %SET(nFloppy, 4) %SET(nMemDisk, 2) %SET(nSCSI, 4) ; nFcb and nFab get overitten by the values in vSrvr.asm The values should ; be specified there so that they will not display as zero when the Knob ; (MiniCustomizer) is used to edit sysgen parameters. %SET(nFcb, 1000) %SET(nFab, %nFcb*2) %SET(fVerifyFileStruct, 0) %SET(nFub, %nFcb*2) %SET(fFabUfbOwnSeg, %TRUE) %SET(nIob, %nDisk*5+%nMemDisk*2) %SET(nLucb, %nDisk+%nScsi) %SET(nUpb, %nLucb*2) %SET(nScsiIob, %nIob+2) %SET(cbNameSpace,%nFcb*25) %FileSystem(Srp) EVEN ;############################################################### ; DEVICE DECLARATIONS ; ; The device declarations reserve Device Control Blocks (DCB's) for all ; mass storage (i.e. direct access) devices that are anticipated on a ; particular OS. The only function of the DCB declared at system ; generation time is to associate a device name (e.g. F0, D0, D5 and so ; on) with the device. The ACTUAL DCB's are dynamically allocated by ; initialization code; the device name, device password and retry limit ; are copied from the DCB declared below into the actual DCB. ; ; There are three families of devices recognized: floppy disks (either floppy ; or SCSI interfaces), rigid disks (either SMD, ST-506 or SCSI interfaces) ; and memory devices. Conventional CT% OS names within these families are ; Fn, Dn and Mn (where n is the device ordinal within its class), but these ; are configurable by the user. ; ; The DcbTemplate macro is used to declare the system generation DCB. ; ; DcbTemplate(deviceFamily, "deviceName", "devicePassword", retryLimit) ; ; NOTES: Device family must be 'floppyDisk', 'rigidDisk', ; 'memDisk' or 'miscDevice' ; Device name and password are limited to 12 characters %DcbTemplate(floppyDisk, "F0", "", 4) %DcbTemplate(floppyDisk, "F1", "", 4) %DcbTemplate(floppyDisk, "F2", "", 4) %DcbTemplate(floppyDisk, "F3", "", 4) %DcbTemplate(rigidDisk, "D0", "D0", 8) %DcbTemplate(rigidDisk, "D1", "D1", 8) %DcbTemplate(rigidDisk, "D2", "D2", 8) %DcbTemplate(rigidDisk, "D3", "D3", 8) %DcbTemplate(rigidDisk, "D4", "D4", 8) %DcbTemplate(rigidDisk, "D5", "D5", 8) %DcbTemplate(rigidDisk, "D6", "D6", 8) %DcbTemplate(rigidDisk, "D7", "D7", 8) %DcbTemplate(rigidDisk, "D8", "D8", 8) %DcbTemplate(rigidDisk, "D9", "D9", 8) %DcbTemplate(rigidDisk, "D10", "D10", 8) %DcbTemplate(rigidDisk, "D11", "D11", 8) %DcbTemplate(rigidDisk, "D12", "D12", 8) %DcbTemplate(rigidDisk, "D13", "D13", 8) %DcbTemplate(rigidDisk, "D14", "D14", 8) %DcbTemplate(rigidDisk, "D15", "D15", 8) %DcbTemplate(miscDevice, "Z0", "", 4) %DcbTemplate(miscDevice, "Z1", "", 4) %DcbTemplate(miscDevice, "Z2", "", 4) %DcbTemplate(miscDevice, "Z3", "", 4) %DcbTemplate(miscDevice, "Z4", "", 4) %DcbTemplate(miscDevice, "Z5", "", 4) %DcbTemplate(miscDevice, "Z6", "", 4) %DcbTemplate(miscDevice, "Z7", "", 4) %DcbTemplate(memDisk, "M0", "M0", 8) %DcbTemplate(memDisk, "M1", "M1", 8) ; SCSI Manager Declarations ; ; The following are the vendor ID and product ID for the GP/SI, which is a SCSI ; device. These values are copied to scsiMgrInquiryData by initialization code. ; See InitScsi_53C90.Plm and ScsiDriver_53C90.Plm for more information. ; Size of ScsiMgrVendorId must be 8. Size of ScsiMgrProductId must be 16. ; Size of ScsiMgrVersion must be 4. %IF(%*isdef(ScsiMgrVendorId)) THEN ( %SetScsiMgrVendorId("%ScsiMgrVendorId") ) ELSE ( %SetScsiMgrVendorId("UNISYS ") )FI %IF(%*isdef(ScsiMgrProductId)) THEN ( %SetScsiMgrProductId("%ScsiMgrProductId") ) ELSE ( %SetScsiMgrProductId("SCSI Manager ") )FI %IF(%*isdef(ScsiMgrVersion)) THEN ( %SetScsiMgrVersion("%ScsiMgrVersion") ) ELSE ( %SetScsiMgrVersion("3.3 ") )FI ; Summarize dcb structures in Gen. %CreateGen EVEN ;############################################################### ; FINAL -- ; This macro does error checking, and fills in various ; counts in the tables generated by the above macros calls. ; ;################################################################ %Final END ###################################################### %'SystemCommon(5, "StringsEqual", "") %SystemCommon(158, "UpdateFsDeviceName", "") EVEN ;############################################################### ; Interrupt routine definitions ; The macro takes device type, name, fDevice and fRaw for each routine ; to be instammmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm% mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm& mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm& mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm' mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm' mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm Crashdump.sysBootRecord.sysMfd.sys CrashDump.sysFileheaders.sysLog.sys SysImage.sys BadBlk.sys+Virtual Mode SBU Diskette 3 of 3 (B25VBU-3)( @ B25VBU-3/3@ @w.AwB @ D 4> v;>9|P^Sys: vCTOS 9|Fileheaders.sysSys< @w@w@whD hyBootRecord.sysSys: @w@w@w.Mfd.sysSys: @w@w@wB 'Log.sysSys< @w@w@w@  SysImage.sysSys< @w@w@wvz BadBlk.sysSys< @w@w@wR CrashDump.sysSys: @w@w@w@ +Virtual Mode SBU Diskette 3 of 3 (B25VBU-3)Sys< @w@w@wl Sysgen_Common.mdfvCTOS  @w89vwpQR Sysgen.mdfvCTOS  @wprqvwjX Sysgen.asmvCTOS  @w!vweG`H FsS_N.flsvCTOS  @w79vw" FsS_N.asmvCTOS  @w!vwl8:3 Clstr.flsvCTOS @wg89vw\? Clstr.asmvCTOS @w79vwk( ClstrAgent.objvCTOS @www@gSrvr.flsvCTOS @w 89vSwkLSrvr.asmvCTOS @w79vw9 SrvrAgent.objvCTOS @wpwpw(8:[f vClstrLfs.objvCTOS @whwwWXR vSrvr.objvCTOS AwPw"w"krl  vClstr.objvCTOS Awwaw*UVD0 vStnd.objvCTOS AwwwX4ZY Request.objvCTOS Awyww-FileSystemS_N.objvCTOS Awww & Fs_SRP.flsvCTOS 'Aw79v|w6  Fs_SRP.asmvCTOS )Aw!vӆw8: :PJFileSystem_SRP.objvCTOS -Awww" ^]\ [ !Z!") Y"#X#$W$%V%&U&'T'(S()R)*Q*+P+, O,- N-. M./ L/0 K01J12I23|3) Sysgen_Common.mdf FsS_N.asm Srvr.flsSrvr.asm SrvrAgent.obj vSrvr.obj Sysgen.asm FsS_N.fls Clstr.fls Clstr.asm vClstrLfs.obj vStnd.objFileSystemS_N.obj Fs_SRP.asmFileSystem_SRP.obj Sysgen.mdf ClstrAgent.obj vClstr.obj Request.obj Fs_SRP.fls FileSysWrap R12.3.12COEDFileSys FileSys_002 FileSys_003 FileSys_004bbb`'FileSysGW`|L `pm DpwwL Ver Fs_Srp R1.1.0 Linker R12.3.1&&&&O55;BOENVZ_ aoj_`nt@oO`ooouP|? ~`?`_P/ ? ? ` 0 %'* 1?_@FoJK?[__`s/wo|`?` @O @/ _P@P\pnɀt v./kN,Ѐ؀uo ]* !  M  (7;WfX-X=XbXXX0X?XX&X=XSXXXX\XXX%X0XsX @nXnJ+C.GMR +H;(duOoO(OOOOOOWDYm3Rgw 9d2'4?e"1?Tu {gp@II6?   /  q  E >"[c   \rZ\,- --x-NM bM M M %M M M M M 2  =!!!\Q"Q"Q"Q"Q"Q"Q"Q"Q"Q" Q"( Q" Q" Q": Q" Q" Q" Q" Q" Q"Q"Y#Y#z#>##k### # # #; # #8#E###$$$$$%w%o%o%o%1o%o%o%Jo%Wo%:o%o%eV'rV'V'+V'8V'(n((>*>*>*>*>*W>*>* >* >* >*\ >*>*>*>*iV+V+V+!V+z+Fz+z+rz+ z+k z+^z+z+z+Nz+z+*z+Az+z+Iz+z+ z+Ez+z+{z+z+gz+tz+z+z+Jz+D-D- D-.....@... .D .......'.=.^...5..%.J.XNOeV- M !"J"Q"Y##$%o%V'(>*V+z+<-D-........eIWh Z2_gp{T W  U   &40p5Wes| C_pX%X5X^XXXEXjXXX!X&X5XEXX[XXXXXX-;IWes$'8F,67A "0>LZhv3 $OU-;IWes&8d3^r;9GUcqwO0OgOOOOOO)O7OEOSOaOvOZO`OOO Lau ';Zo^:/Gvz"/<EJNRVZ^b flv                              +KYmMqNs!8I*Se)K_>eeeeeePTX\`dhlptx|*mr!;^12]9Qn|U-q!      o      Z a |      F {        >q "2<DR]mri|J` +Gp#t~ . =      0 C {   = T      ) _ |       ; I    ,br%;N^ty' . e   a     g];gwE [  , J d  4 %3z1EA R A ~ X .Z:~ .B8N08f ?{'5 '\+q :BN]b e $Y_RzB H Z     & 4 W h n |   g2Ij 6=BG"( 7?!4GP]jo}(:}   Uz'bs "$,V].:@Q_9M-5P7Kc~EKVV(VEVKVhVwVVVVVVVVVVVVVV*V1V7VFVLVUVVVVVV V$V1V7V^VxVVVVVVV VV$V,V[VaVVVVVV VFV\VrV{VVVVVV/VAVVV^VVVVVV*V>VVVV3M| @Qlr *V%0 T,39"{------------------- ---$---------M-V-^-w-----------3-<-D-U-h-q-y-~--------u------*-4-k-------4-V-u-------- --+-3-D-W-k-~------#-?-E-S-[-m------ - -( -- -3 -< -A -T -g -o - - - - - - - - - - - - -= -N -T -o - - - - - - - - - - -/ -? -` - - - - - -D,s   + |       F    s   )M 1M M M tM yM M !M VM B [ a : ? b h    , 4 ; F p      H       1 G [    a     M t    3 8  *  y # Z v   ] }!!!!!!H!\!!!<!W!p!-"H"" ""0""""@"\"""" "Q"Q"Q"Q"rQ"Q"Q"Q"Q"Q" Q"[ Q"z Q"N Q"X Q" Q" Q" Q" Q" Q" Q" Q" Q"=Q"NQ"Q";Q"xQ"Q"Q"Y#Y#Y#Y##2#?#O#c######D#`#r#####F#u#####{#######}##### #(#:#H#v#### # # # # #w######4#^##2$q$:$$$$[$$$F$2%8%a%%%%%%,%1%?%Y%w%%%%%%%%A%G%t%%%%%% >%%+%W%r%%%%%%Do%o%o%o%&o%8o%Jo%\o%o%o%o%o%o%Ko%o%o%o%o%o%o%o%o%o% o%o%y o% o%6 o%O o%q o% o% o% o% o%o%o%Oo%Yo%co%mo%o%xo%o%o%o%o%o%:o%?o%o%o%o%o%o%o%o%Zo%o%Ao%mV'V'V'V'QV'V'V'V' V'PV'^V'jV'V(z(,((((( (X(((H((((((((=(v((((((((((2( (x(((F ( ( ( ($ (9 (Y (~ ( ( ( ( ( (\ (x ( ( ( (< (Z (n(((Z(((((+(5(((1((((((>*>*>*>*7>*>*>*>*>*M>*R>* >*) >* >* >*3 >*m >*r>*>*>*>*>*>*>*>*#>*z+!z+8z+z+z+z+z+z+z+z+z+&z+?z+z+.z+z+z+z+z+z+z+z+z+/z+z+z++z+z+ z+3 z+~ z+ z+ z+e z+ z+ z+z+Bz+-z+z+cz+z+z+z+.z+@z+Nz+z+>z+z+z+z+z+lz+)D-6D-D-2D-<D-HD-ND-aD-D- D-^D-D-D-CD-oD-D-D-D->D-nD-tD-D-$D- D-hD-D-D-D-D-5D-JD-|D-D-D-D-D-D-D-g D- D- D- D-. D- D-, D- D- D- D-% D-| D-G.^.c.i......0.>.p.....|......Y...t.....=.Z.q.......r.S.m..%.=..R.W.MARTa>0x"N^ć4FF t.vPPPdPPPHPP^ FFvćD FF u^F&8t^t&^ğD ^F&8t&Gs^&Grm@Pj`^FG0vt F^w^ F^&vD$&GD8&G Ft U(&G(&G(&G(&G(&F]U^&G t8 8 (^&G t0 0 (^&G t< < (^&G t2 2 (^&G t4 ^&G t> ^&G t@( ]$jPLPtl&M(&G s0-~((u+J& jjP/|Ptl&GP(PtlP(PtlP(Ptl%F >`t f&^FF; w% ;u;uFuҡ( u4f&jPF%FM(&s )jxjFN؎&W&G &O FމvN+FމvƊ&G&GFދ~&G&jFvxvW&TF(HF棄jNFF9rF^&G fNFs١K(6 tr@P6 P6 PF6 H;Fr3hvFHXXFuă>: t)F: H;Frj`FءG0Fuܡ( t4PF(H;FrhvFuܡ( uK(9nu.NPXf& nFFF?w!l +&+&HFu׋FF(HH;Fr&GF&F,u&>4 tTp;K(tMf& pNFpFF;4 w_^&F^F FuAK(NFFF;4 w j F^&^Fu׃>(t-FF;(whFء`Fuh|PPQPNPtlhPPRQPNPtlhPPQPNPtlhPPQPNPtlM(&Gr[&GrSM(&GsjPj Y ^&BM(&Gs/FjvFP, uF$< u ^& F^&BM(&GsK>( uF~w3hjFu$>(ujj>(uhjhjjjGM(&Gsrhjhj$M(&Gsh0j shjM(&GswjDuvjDthjwjDthjdjDthjQjDthj>FPsvj)FP svjM(&GrFjvFP, tjvFP؀ tF%@uvjvjUF$<u vj F$<uvjFtuv#F$&Gs"ފG{$G{uG{XG{~&0~&0XG{GM(&Gs(X$uƇX~&0~&0XFXtG{$G{uG{XG{X$uƇX R\6FXw:~F;vvF;u F;v\t>RuDM(&G s#&Gs~&0~&0M(&Gs  RM(&Gs"&GsZ&u $uGF^M(&Gs&sj?)?)&w &w ?)&w&w FPFhPP^SPNPtlF^M(&GsJ&s?)& uj"j?)&?)&G r &G <t<ujjU?)&w &w G?)&w &w FPD?)& t0uj&w FP$>uj?)&w FP hPP^SPNPtlM(&G s!&Gs>u~&0 R tM(&G s&GrPPtlF?;)&G&OP&G=u@[;PN ;ڱtA4Z;" FFs=;)&G&O++&W6M(&Ds;)&;)&G F<tAM(&"ON<uQ?)&G F^FFFF}F 10^v&F1FFʃ>tw~uFt>p&uf F$ FFF;F^&tG4:Fu Fs FF̋^G5:FrG^_FЋ^WF$p t 5uqFU]U~t8^Wj^W^W2^W]9FuX>uLRQPv4>j j\Ptljj\FHN;r^Fu*>u.j >ujPPɀPtl0M(&Gr&Gs~uj Lr 6M(&Gs"j{RPRPQhRPQtj RP6K(j6PtlF;u6NF0>v^jM6FFL^WL^WL ^Wd^Wd^WjhMF u>u ^_0)FFءG0F^G0;uF^G0F9Ft^G4O5vL'TDD8DD!D/L->M(&EsGXD5DK{M(&Gs ^G5@M(&Gs^G5jDF>un~u ^GX.~t ~u ^GX*{~u ^GXk^GXHa9Fu\^G4G5GX^G'OGGG#G)G/G1G-6M(&DsG5^G5MFuf^G4G5>uGX ^GXF^G'GFGFGG!GNO-O+NO/NOKNOINO3NO#NO%NO'NO)G5 G6G7^G4G5GXN^O'ONONOGG!FG#FG'FG)FG+NO/NO1G-G5F^G IL D!D$\BD>DQD6DRDUDWD"DXtDTDSVT^GTGSST^GV^GXuSjvj|Ptl>uzFN؉OO G GGS1Ptl^GGj j\Ptljj\vK T^G5t^G!^G>j&tjj&&P(Ptln&P(Ptl&%F &>> t,FF;> wjLFءf&f&`&Fuك>@ t,F<F;@ wjJFءd&d&^&Fu١B r&b&@Pl&؍Gh&Fr&HN;rl&H@Fuڿ& 򤿖& 򤿦& v& t&&z&~&t&P1PtlFF;zw\6&cPtlFu>j&t?p&ts2vFp&Ap&j&NFj$Us]˃>j&tJ.2,,26*8,P1PtlM(&G s.RPRP_LlRPjv4L7RPjv4]^~FF$~FF ~FF~F~ FFFFvNʺWRQ6p&PQFPWRQWRQhpmcF u?F~v.vPNQjNQj$NQNQRQPhF t~ujPtlF멂~u~tKFα"t<tM(&Gsjp&FPF$<ujjhMFʋF u(>*u ؉G0*)FʉF̋ء*G0Fʋ^ʋG0;*uF̋^ʉG0FʊF$<u ^GO^O@p&G NO!V W$G4v Dt % F^ʈG5^G6FGFFGHGDvfPtlFRQP6p&vP^ʍw>VRQPG@PGPhsmcPtlv^ XZ^ȋ^ʉGBFFF~ve^w>PNQjRQPFPFPGJPjhF u~u&~tjPtlXFs^ʀLuE~v?w>PNQjRQPFPFPGJPjhF~uFFFEF$* <tjhMF uؠp&G FG!F G$vfPtlFRQP6p&vP^ʍw>VRQPGPGPhpmcPtlv^ XZ^ȋ^ʉGBw>jGJPjFPFPjFvfFF tPNQjNQj NQNQRQPiFFt5~urzl^W$^Wl4 ^Wl^WL7^ WL_^ Wl2 ^Wl ^Wv6FP!vj jj Jr$RPjv4hYsFGGGGGG GGX <LJ=G:jPPɀPtl$^$$(:!Ƈ"#$Ƈ%FF wN^?Fuj +RP6K(j6PtlF^wXj\F^=;EMDth|$^UDD9FVuUt uTu VFVFVFF^~u~tF$G^.^G ^G ^G ^G^GNɱuAONɱuAONɱuAOG#8Fu^GG OGGOOHF$^G~u~u>^.lt}^G +^G "^G ^GF$ ^G^`.^G^G^G^GF$u@^GF$u@GF$u@GGFVut uu-VFFwV^v@FuvFVuUt uTuc~u~TuFFFF;w4^W;t#VPG^+#NV@Fu‹VV^G~urzl^W,^Wl4 ^Wl^WL7^ WL_^ Wl2 ^Wl ^Wv6FPvjj@j Jr,RPjv4hsFFPF^GGGGFsO@Fs^O Fs^OFr^O^GG:~ uGX&>~ u ^GX#.~ t ~ u ^GX'~u ^GX%^GX$j^ꍇPPɀPtl,^ꉇ,G tƇ2^ꈇƇ~u ^ꊇ^ƇFFwBJt3Q^H~ u ^GX#.~ t ~ u ^GX'~u ^GX%^GX$4^̉4CF戇V爗ƇꈗFsƇ^Ƈv^̍v^̍ F^̉G:FմF^̋;Fr FuF^̉FsOFs^̀OF^̈Ff&Fȋ^ȋ t>Fʋ؍G,Pj jFPFPPtl~ uFƋ^ʋ^ȉ`&빋^wX4RP6K(j6PTtlF^Guu^^' t 5u^jPtl^G uƇ ^FFw1Ȱ^u  Ѱ^ VFuNj^Gu  ^$^RGZR`ZRbZa.&.6n^R`ZbF.&HN;r$^a.&:th|$Fű^R`ZRbZhFFw8^RZšF~ w^ FuFu^„Gt ‡ ^‡ ^wXj\~urzl^W< ^Wl4 ^Wl^WL7^ WL_^ Wl2 ^Wl ^Wv7FP,vjPPJr<RPjv4h,sFGGGGBGGG:jPPɀPtl<^<& jF^ً^~K(^G <;OW vD:GR"G_~tj < RP6K(j6Ptl^GX ƇLJFFwFv^ FuF F wXFv^ FuF^(j +RP6K(j6Ptl^OGX ƇFFFFwNȋ^ FuF F wNȋ^ FuߋF^(F*F^wXj\^Gu*@^^^ P^x^ k^R Z$$^^' t 5u^(^' t 5u^"^wXj\vs^^' t 5u^F~dwI^2^' t 5u^2^' t 5uFu^^' t 5uFFt^0#FuuU]e emeeeXje  @  % @ 9fddd [[ [f999e j"dddfjj j (  j eetd1d~!je,eeMeeddeee(NeN Gesd~ Mesd~MdNN\jetdQdV!jeHjjjjG<GGYe0eHfdjj j Xj@  j j(@ @j eetd9@t2jJnt@999::9 9etd#::etd9eQ@j 9etdddd~jej*e@j dd~ ~@j eN@``jfjYme_=j  Ǔ8`` etdj4jfjXeajfjYejf4jXe Ǔdddedj;jfjYjme_;  jfjY jfe4ey4jfjXjfjVeey9j9@=j999<=4@99 9  e<=jj<<<==e4eaej*ejfe]Ǔ1jeyeetd~ Ajeje Qj4jfjX4dddjeea4dj4(eajfed d ddje1jee18>IIAjjf4jXjfjYeje@02jJn0ee esd:esd:GGAje6qj`jjjLeenldjj Le Tee eellmlmlmlmlmlmlmjmjmjmjmǓ8bjf5jYjme_ h5jfjY44jfjdmdddoej t td!jetddddxajedjjj0jJn j  ~jjjj<<=dj=wputRQPv4U 2rP1$>ptzjp~t}j@FSj@j^PFPF^`?#t'>^PFSj@j^PFPF^`^P ¿Y? ^>`hF#tPFf^tvShjbPFPF>tbdbP ¿Y? b>dhFShjfPFPFfhfP ¿Y? f>hj t j|PjPɀPtlhF؉tvShjbPFPFF=sBP+N+F؉tvShjbPFPF~dsj$>tj +RP6K(j6PtlK(td(xF;u6NpFB>vyjH6pFu+ Ft^Wt^Wt ^Wt^WtD^W~u(^G FFwLP^^@&Fu8~u4^GG G"FFwN^H&FuFux^O G F G"FG$NFwN ȋ^H&FuF6^GF2G@F4GBFGDF|^G F%FPG G"FG$FFwNpȋ^H&FuFf^GFbG@FdGBFFGDFDGFjhMF u|n>ru ^_0r)FFءrG0F^G0;ruF^G0F^HG G!G$G,G.G4O5G6NOBGJ2GHWFGDw>w@ GLGM$TtS^G!ut/W W0 t 5u^W0FW :^W0 t 5u^W0 t 5u^W0F~u^G t  G^O~th_$^G t$tppu^hOpu^Oj j\Ptl^Gt7W  t 5u^W vD! DLSSF?^GtdW$Gt+W  t 5u^G! ^W C^W d t 5u^O! ^W Fd t 5u^Gt~v9DHvG^G^W GvDL$LHI W2^W*^GFr^W,f^W.Z^W0N^W4SFF^W2^GL t 5u^W4vDO@":u>DN  t 5u^W4쨀td^W4^GO^Gtt W ^W j j\Ptl ^!uH^!uzHFN^&G&׉FVRPjju^F&?t2^&t(^&t^&vDJ&GDH&GDFU]F~0uw$F~ w^W4쨀u FuFuհ9FuO>u\RQPv45j j\PtlFHN;r^Fu>uwj>ujPPɀPtl0M(&Gs"j{RPRPQhRPQtj RP6K(j6PtlF;u6NF0>vVj16lFF\^W\ ^W\^W\-^W\^WjhMF u>u ^_0)FFءG0F^G0;uF^G0FF^GGFG FG"F‰GFG)FG+FG-'GFG HD D!D$D4D5\BD>D6LSDRDUDVD"VR|Ptl>u8^G/G0G OGS1Ptl^GGj j\Ptl^W)0^W+F^W+F^W)pz^W-Fm^W-F`^Wd t 5u^Wd t 5u^Gd t 5u^WF ^WU]s'vFPhlP7^Nis0>I(u\I(I(%I(9Fvje$I(+FI(F2>I(u)I(I(@%I(F\+N;sje$FI(FUvF]sFPFP*P7V%^^~RPSju^FFVFh@j;)P/|P7hjP/|P7jjFP/|P7v' F  )KpjjP/|P7j(jP/|P7j&jM(P/|P76M(Q(-Fj#jvP/|P7q(s3jj~P/|P7j"jzP/|P7&G'(j$jP/|P7hj?)P/|P7FPLP7F%0 2q(sj(PjB8P7(B*r^ &&W^ StYFVsFFFFF; vxH ؍F؋  uF FP^_ Fr'^F׌F١K(F݉F߉FwF^GFsFF^trFP(P7^&F ;vN^wNFFF% RPPRP<FNQPFPP7F RPRPRP<F RP^SRP<^&F@NFNFt|FF; wHćFF^FuFF; wHćFF^Fuރ> tgF HN;rW؍4^^FFO& O&LO&LO &LO &L &DP1P7FuFF; wHćFF^FuFF; w?%0&0uv  @ p % @ @ @ @$hijrsdecfgk LocalLocalMaster FsPeriodic Fs_Srp R1.1.0Ws000Ws000Syncxl4  L 6= ) i|& > |` aa0F0F1F2F3D0D0D1D1D2D2D3D3D4D4D5D5D6D6D7D7D8D8D9D9D10D10D11D11D12D12D13D13D14D14D15D15Z0Z1Z2Z3Z4Z5Z6Z7M0M0M1M1UNISYS SCSI Manager 3.3 FJTh$ 6 T r  & D b  4 R p   +  =>ER UNISYS SCSI Manager 3.3 SCSI0O"GB, , -  -  $(,048. <@DHLPTX\. `dhl FileSystemMassIo ScsiManagerInitFsMountDevicesInitFsSysDevNumInitFsSystemTime InitFsFinish  # 4 U^Sv Pv ^Sv T Pv  FH ;pr- T   Ģ  uŸ PFP^SP > t^Svs]Uvv ^Sv QP ^Sv PP Ȋ:r:: v *󈄺 u PvPP^Sv >u^Svs]UdFF ;Fv FH; s F H ;r: S^6 &^& [ Ĵ  u t$   Ĵ   tpPFP^SP ]Ud^Sv~tA s^Sv~tA s ^SvPeP ^SFPQP ~^K{~v!Pv9 ~1~ظPFP^SP PF P^SP ]UFPN Q^SvRdWFPQV ] U~Nt+Jt@]U~Nv vv~^Y] UF;w)+^& & uʂ>u]UFH;r"^& & uЂ>u]UF;FrF]UF;FwF] FFFFFG~uFlN>^u+JVt+HF @F FF t! vv N F~u`1>u&?{uj_j}shIh jrhIhjsF~uOF6 )KFFr/>It(hIhjrhIh )jrE&?[uA>t:&!uF&+uGjj]sI~ut&?!uF&?+uG> w?jj6>t->u &?tjj>r>2vu~u> wjj6xj)j6Ft t>tƀ>u>$t>r<0r<9w >>uF4F<2wNO~t>FFw9ر0VsF 1Ѿ+NF 1FFuFs &!t>u9hh js*6& Fhh$jТ_hh(js9r\Za\\9rhZ tQh؍GPjs=~t'ZGs %tVZ#tV,ZG&X t U\uc drD>u4ZthZGPjrV`>tVXOwFF;vXhGPjrXCPtX#;u^^s)&&QPP \X!thG!Ps`XGp\Z#t9~t3V,+Ft,ZFr dsFV>u@F>tAN"r~uFrFsIFu+JV v vjF@PUNF+ȋv1~FN;s+Hv@|]U>>u)~t#^SPj ^FF N]< utj$.(*r>ulFV\Z u]ZG&X uLXHu?XwFwDwJ< t!XGLP%FYN =rFwFwDwJ < tXGJ@GJN;GHrOJF vv6~F 6~Fv6 Vw_Fv FXGLwFwDwJ < t tUh]r jhjPLPtljjo6PF t6LPF~t6Pljhofrh>u^ S46F6V &^&&GF9Ft@FĴv &GćN븃>u6p>uhc&u 6LS l SlU~u*^& ?u$^&G&GP&Y ]6LFP u-^&G;uF&GSl6j^S l6jFP u6L^S lU>`u]j]v vvFVr \;4uF:9uF;7u3\4FV68QRPjjt<F t4Fv v vKFVFsFZG2\FP^SFPvvFP! U^ Sv vvjt<] UP6866j7<]U\4v vv68QRPj7<]ZGt.|v vvyFVZ_2\S^ ShRPFP"FPs> u=PPvvjjt<F u"P~ t+JtF FFV FVBD<6<FPDF6RP l^GFDBF>&u6M(&Ls D5$/ tG^uS^uGt^wS lj j\jj\^GF|(u\(^_(^?t7^FvDPTR;WRu;GPw(^GPWR^;WRu;GPw^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7Lj j\jj\ ^GFG t GPGR^VuOw^GPWRFVFPl^FS^wHe^S^wJe^G_^S^wLe^G^FVG\^;GNsF t ^G^TuRHWwVjGLPGTP^GvDHH!GTtg^OGLWNvDHGT^GJvL_+gHF9DVvDV^GT9GVvGV^GVv1tHG`>tX TsˡFFF;wc^_0^GBFG(F"tA uB"s O(G*D2^"t ^"u G"S(LFu^G*FG"GB\S(Ps}& ##;t 6K T&vTvTr0^G t vjh,^G,S Tv,nvT<tvZd^G"vD tJOXQ ɱuAN8WGt@F^t6D5Pu:tSjhL3Lv v ^G*FShT^G^v D!>E9|N(u G\EH ^G\GHGHv;D>t?L"^W uuG8D!G9NGHG:G8F^G"^G\6D:GtG sHWPQwTl^G <w?G\6D:G^D;G_PD<~EHD=XG`D>ߊGDD?GFD@F ^_ .kuG8F@G8E6G8MvDHG:DJG;DEGF^GZsw[AFF[FTFFJ^G"FFG"Fr^G"^&G^GHGJv&DGVHWPjGLPGTP^GGV;GTtQ^&G;v vjh4^GVGTOOLWNNsHWRQPl^gFs ^O^gv~T^GZF tPTF tvjPFs vvv ^GBFG*FSjT^Gt"uPQHWwTl^go~uLFtEPTF t^GA^GS T]^8uTvDZwA~}[:F t3^G=LuF~,uF F@v TF^GA^_^F&G t ^&9O"w^&O"vtA&^OS*U>t L]M(&Gs&Gs sˡF؋ONT*V ҲtB t@ s|"t T^wwTˡ&^G@SjT^wT^Gv|"u G5$tW+^G"<tbvD tX<uvDuSjhE>vj5^Gt vjhG$^G8jTF tvjPvjjˋ^"uZ^GuFEF uvP-TjTF u݋^GA$^:G!tFFƋ^GPGP봋^GtFG뤋^G8FG8jTF ujTF u^"t8FuvLAЀPuG"D8G!D9ShTjTF uˋ^"tSTЈF^2GVtFGVGWuOW^WK t^G5XtvTu vjLT^GWtS TF^UMtgW^gWG"SZLvsv~^u v"F~u^uGtv TvJ쨀t8>u1^G5t"wwT^G F tPf ð^GFPj TvjT^G"G*^wS lvZL^GFL*NGAu|"uSEr ^GJ1/^GAt ^G,^GBtG8$<t^G.^GFD*FuLVLLTN;Ot ^G <u^_^G*F|[tG:^"uG"vDHG>n^"uS^G rGtPQHWwTlFPwVF vB^u*Gu#^G"^"uG"G>S(L^GFD*F|[u-w8}a ^GvDjwA~}k^G[OZ:s;G[:u&^G"vD8G!D9ShTjTv(L^G<^G-^&GFF&_ ^GBFj j\jj\FFF;vQ^_0^GB;Ft5GT;Fw]GSv1&tGTGWtSf ^gW@^GVsGXt^G5t&>u v TF^OW ^F(GT^G*F t,"t&؋F9Gv)G^tvhI-T>uFr~vT<u/FPP*TȈFPT~uvjTvjLTvT<u*FPP*TȈFPT~uvjTL^G5 tFFtj j\jj\^&G^GBF~uG!F^G5tFF^G5tW#F^O5tW/F  P$Y h^G5t"~tF vT!ʲ k^G5 tK~uFF^!u'vT#F"t ~uTI/^WI%^W%F^G5@tW!$ FW/^_B^FG5tvhT^W-FG5Pt ЈFd^G5tFЈF쨀t@8^G5tn8^G5 t/FF^!unFsFFFvjTFsFF^GXuVFsFs F^GG^GGF^G*FOX#ʈND tDFF&Dt WX^uOX^gX^GX#"N;tFFvvT<uFs>vTuvjTvhLTvjvT<u vjT^_B^G5 tG6^GQ^_B^G5 tFG6 F^GQ^_B^G5 tFG7 F^GR^_B^G5 tG7^GR^GBFNsMD5@tT!$ W! ‹T/k^G5tvL!Q Y -^W/@^G5@tW!$vT!" W/^G5tW/ ^W/^GBFOX ɱuANG5~t(sW^GX@t ^W^W^G5tW1^G5 tv|!uW3F^G5t FЋW1_^G*FfG5$tvvtNtLDVHPwhv^wNwLGVHPwjG5$tvDVHW'W+M(&Gr&Gr&GsM(&Gs PhjPPFG5$tP66jwPh66jwj t 5uG5$tW'FF;Fv_FGGuwTGFuA2wTG@tBWv@8F뗸j j\jj\^GF tQPZ^G*F t>؋FGvt8a ^GvDjwA~}kv TvK TFFF;v^_0^F9GBt#u\Sv  ^G#G"ShLTvhT^G8vD!G9jTFFjdcFd^wT$GWGUSPTvjLTvjTFt.F;u ؉OLj j\jj\FFFuvTFFu`vTF@uQVF~w@FFFuvTFFuvTF@tvTFFuU^G5&tS$tW+^W)j,^W)j ^wTj^wTj^wTN^G5t(V'"jV'"jV' ^G5XtW/j ^W/ jd^wwTjd^wwTjdx^wwTjde^wwT^WK t^G5u& t^G8G9G:G;jTj ^G8G9G:PT]Uv],^u [tFF^Gt^.u^GF؍FPl&FFsF- ^GF܋^G[FފFՈFFv؊D!FFPlvta FPlvtj^؋G&F t@؊O wNQlv֊Lv֍tFPlv֍t FPlSj&n,FPl&FFF tW؋GF t؋G*F t.NQlv֍ta FPlv֍tj^؊G!FG&F t@؊O wNQlvԊLvԍtFPlvԍt FPlSj&n^GBFGXuSTF^2GVt FGVOWz^G5XtvTu vhLTvTЈF:u(^2GVt FGVOUOWv TF u#(^G5XtvTu vjLT^gWFFF;w.^_0^"u*uGWtS TsFuɰ^GBFSRPrF^NOD>D"8LUuDUG8D!G9VQTj\^WK t^UuGUM^OUShT^G8vD!G9>M(&EsDU$ ^GU^G:jTF t6K T^G"SZFGFFFȴ;FrgFGGuwTGFuC:wTG@uDwTv@AFuF~wFFuVFF~wFFuFv^uGt^wS lj j\F^GF|(u\(^_(^?t7^FvDPTR;WRu;GPw(^GPWR^;WRu;GPw^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7j j\F^GFVuOz^GPWRFVFPl^FS^wHe^S^wJe^G_^S^wLe^G^FG\v;DNr rF t ^G^TueHWwVjGLPGTP^GG <t<u%^GV;GTtOOLWN8^^GHHЋ^!GTtg^OGLWNvDHGT^GT9GVvGV^GJvL_+gHF9DVv ފO sGV^GVv1tHG`>uwFFF;wc^_0^GBFG(F"tA uB"s O(G*D2^"t ^"u G"ST\Fu^GBFG!^ GW ^W ^WF ^WG ^WF^G*FG"GB\STPs /tvZ^G"N(u ^G\^G\G(G(v;D>t(D"^O / uu GG^G"^GtG sHWPQwTl^_ .8BLV`jG&GGGG^G^GBuG/<t*uG0OWO/Ë/uG/_^G*FW)09 W+, W+ W"F W"FW)p W-2 W- W)0 ^GVW+ ^GVċ6T+w wNwLGVHPthM(&Gs PhjPPFP66jwP t 5uGFL*NيW^ WD! ˆGWW t 5u^G>WG$<uW"G(^G>W0^G\WG"n^"uS^GtG rPQHWwTlFPwVF v^u(Gu!^G"^"uG"G>ST\^GFD*F|[uOLaw$}j^G[OZ:s(G[:u^G"^G5vT\^G<^G- j j\F&'sv$' uR؋ON t0NL*NNLOLaw$~}jvx6"FFF;v^_0^GB;t#uSv  ^G#G"G! WmW`WFF~ w.~t(^' t 5uFW$FW^' t 5uW^G>Ft 'OWO/vZj j\FU^W^' t 5u^W{^W^' t 5u],^Gt^.t ^u[uFF^GF؍FPl&FFsF- ^GF܋^G[FފFՈFFvD!FGaFG\FG^FG_FG`FGjFFD&F t@؊O wNQlv֊Lv֍tFPlv֍t FPlSj&n^&GF&G&_ ^GBFj j\FFFF;v^_0^GT;Fv@FsYGSv1&tGTGB;tHSRPs7^GPFS$^GPSZF^2GPtSf  ^F(GT^G*F t$"t؋F9Gv)G^thIFt<>u0^/uO0u G/GW^/u O0uG/gj j\FU]U^GNv&GL&DGJ&DGH&D&D&D &D G &DG!&DGE&D w.w,h^&G$&W&&G)&G*]F^&vDN&OLL&WTJ&|HO|6&_ \EPDHdJP6^G,W.GNMtu(^JuHuLuSjvj|FF^GBFGNv&GL&DGJ&DGH&DG&D&D&D G &DG!&DGE&D w.w,h^&G$&W&&G)vDXt:&G*~E5Pt|&ta|HuZ|J tE^JuKA^GG^&G):^&G*v|&u&G)"^HuJu ^&G)^&G)F^&vDN&OLL&WTJ&|HO|6&_ \EPDHdJP6^G,W.GXtJ uSjG^JuFSj9^GNMtu1^9GJr HuSP^LuSjvj|FF ^GtSi ^G@t4^_^G*F^G\;FtF uj$v%^G@uG5rL^G\ uG/8^GF|>uGP^G\FvLBN^O@vDGwD G(^G tSv^uGuv|(u\(^_(^?t7^FvDPTR;WRu;GPw(^GPWRv;TRu;DPr^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7v^uGt%^G\ tPL^G\^wS l^GFG\FG tLLO_^F&ONF^&"sB_ uC"s D)^&^O.^u^[u G[GpS ^G t vD^)u^[tSh8^G[l^8G)u&^[uGp^G[:GZsG[؋^G΋^8G)uċv|[uDpЉG>W@GB^G`$F<u ShQ~u ^G,A~t~u ^G.+~u^ ^G[:GZrG-^G[^G<^uS^w_@B^Gp^G\FONF&TTD~&ML$O rD^G^&G^G uO^&G^G+ ;vO+^+u^G^O+v&t,F^G)^*ugG( t`FG*؋GPWRFV^w\jTL^?u ^G(-FF؋^GPWR;Vu;FsċF^G(^F^Gt^GFG\F~?FFsF- ^GF^G[FFFvD$FFD FÊD!FĊD@FŊOqNƍwr~F^Gr uGuFԊGtFՊGs$F֊Gv$^GwFԊGvFՊGuF֊GyOz F؋^GpFڂ^uFF^w^~۹^G& tF؊Ow~FPj?n(>*u ^ _0*)F Fء*G0F ^ G0;*uF^ G0F >8u*8^ ^&Gv D &OL!D#&OL@;p&vD$^ G j&^G^ G$^ G4G O! G5GDHG6RPVw Qw@O>QRPVGPGPhsmc u8^ G j&^^ G! G@^XZ^^ GB^&u5rLF u ^&G(^&Gv\D&GDV ^GFF&D FGt5u1)u+OL:uظGG$W+G,G0a^#u^uq)ukq^G,t<u;^uZ)uT:G_$G$G+G,G0ЉG>W@GB0^,u)u<t:t<uvf ^G^Guy^Gunv&|td&L~M0&L N|>t҉GODBFGUW‰WGG$U W(G+G,G_@GB뇋^GuSL^&G+^G vDBFGD GG*G)SPTLFP؍GDP^G$Pc l u!^&w&&w$^wD^G,W.^GDG,G.^GDHG6GB t,FL t ND tF tS^GFv&DGH&DGD&DG &DG!&DG@&D&| &FP؍GDPFPc lF uvv^wD^G,W.^GDG,G.^GDHG6F ^ w>jPj FPjFPFPFPjhF t@~tA"NtA"r~uB~u~tFy/F^FGF^FGFGFGWFv ^uGt^wS l^_^GBFj j\^Gu r^(u FG(^_(^?t7^FvDPTR;WRu;GPw(^GPWR^;WRu;GPw^?tX^F؋^GPWRvLP|R;u;sD s-GVGPOR;LRu;DPvFF؃?t ^F벋^v7j P\^GFDBFG t'DtЉGPWRgG^G^VuOQ^GPWRFVFPl^FS^wDe^S^wFe^G_^S^wHe^G^FG\vDFO_+dDFvDtG_^G\^;GJsF t ^G^TuG@tr^Gt^GVGTG"^HWwVjGLPGTP^G^GDHЋ^#GTGT;GVug^OjlGLWNGVGT^F9GVvGV^GT9GVvGV^GVv1tDG`>trF؋GBFFF;nwz^_0^G(F"tA uB"s O( tF^G*S-^"u)S^GOt sPPtlU졬 tGt7]jPZrj$j]^GBFD0tT2GL^W4FS^Gu%vL! W f^W4FW %^G! ^W @^W4FW F$PFr؋OBW*V"u6DtE t dP^ ^G>v;D\t^G" ^"uG"^"u7^G <u\u ^GN ^GN pGjho^"tGu+OjPZsG$ G^Gt"G sXuHW|PQwTl^_ .G-G5GPGtgvDHG8G:GtvvGtUv|"uL^G sB6t8W4tW&w8oO6G8O:G8O: ^G*FDXDFF&LNFG"^&G t &O tO8G:1G6 G66TtW v&DSTtW2v&DSTtW0v&DSTtW.v&DSTtW,v&DSTtW*v&DSTtW(v&STtW4v&D^G sD6t:W4tW&w8oO6G8O:G8O:F|"tgGW<0^GVHW>^GVHċW>WD^GVWFv^GVċWFWuˋGu r^G*FjjoGtxW4!upv|"ug6taW4t^G sW&w8oW&8mG6HG6O8W:O8W: tˋGtSTtGtW$W4G u&FFw*P&v@FuG tpG"GtuW W vvs vv^uvS^uGt|Gt gj^Gt"G r|PQGHOX+WJRPQl^G*6"uu jjo^G"^wS l>u2GtGF^G t%^G"<tA<tB <t@ FG tG"Gu@oFskW<0W>PY GG PGPG $t@ uAuB ʋv|L|V;uB "GG uFr=G7Gt G uG uG t\Gt)W  t 5uW vtyGu!W d t 5uW ӋW  t 5uW 묋G t FsG @u ^G,[G t ^G.GGt ^G-3Gt)G $<tGtv|"u G $<uGtDvD t:DFF&L tv&9D"vw~&}^Ol^_".4HVp^G"G>7^G\^G>볋^G"6D L G>SgG Gt vv L^G"^GbG)Gt ^G" vvsvvj$U^[uau6DGctd^_".7o,Ko,y,V^G[u jjoԋ^G"G>Cj$^aHrGs ^Ga ^GZ8G[r?6|@uLts~ELtt u\u ^uRvv:^GD^;GVtG_6L:sG`:w"^G[G`vDDGVGHG8G:nGt.Ov*L_L`~eDDVtFG8-O:G8O:5FPG^*G_^gDPF v^G`vDDGV^GZ:G[tvu^G"GN GGu4^aHsXGr4^G"G>t vO^aHs$Gs^GavSJGt!;^GbvD"6DD tSQ4vvs vv]U^G[ObWauvD:O[O[tUGt ^Gc6"Dt_a^Gc6"Dt_a^G[;tvSh^GbGaG[FPwVF v^uGuGHG8G:^G"S]^_*^GbG[auG-3^GaG[6Du^Gc6"DtG`^G^^Gt t+Jt#Gtc^GbvD"6جD!^bs56Du~E"GbD)S^G"Gv vv ]GO F^G@t$Gu GHFFO^GX|FN=@FHFPF^G@GLWNRH@PRVX%NFNYFFw$^N9ODv@^&0FFuԋ^G@uF@FHFPF^Gt0^_^GBFFPl?FFsF- ^GF^G[FFFFFvD FÊD!FFFPlvtf^GdF͋^GtFF^G@;GJs FF^G\FԊG^F֊G_F׊G`F؊GkFڊGeFۋ^GtF F^GcF܋^G&F tNQlvLvtFPlSj?n j j\rF؋_B^Gu r t Gt;^&G&gF;s@Fs F)rFFF;nv^GBFG*F t ؋F9Gv)G^tG]Sj^G t/^Gt(W  t 5u^W vtV^Gu$W$W d t 5u^W )^W$W  t 5u^W vh]  ^Gt gj^"uu jjo܋^G"G>^;ujjoLFrM(&GsF;t^GOFS,^GO2F@tuOOtd^G t[^W2^GL^GN ^W4^W4쨀td t 5uvvf ^G0FFt^&Gj P\FsvPPtlj j\v>t$j P\^GBFDt{9OHvL^GvTt^GL$OHI ^W2^W*^GFr^W,f^W.Z^W0N^W4STtF~0uw%F~w^W4쨀u FuFu԰U]^GBFOJv& WH&TWF&TWD&TWLҲuB&TWҲuB&T ؊W &TW!&TW@;&L s&T ^&G^GMv&D GN&D!w.w,h^&G$&W&^GBFv& OJ&LOH&LOF&LODDt OLSt$^Gt^&Gs ^OL^gL^Gu^&G s&Gv;DJsD@ ^GJG@^&G vDM~Eu &!rDN^&G!$^GN^GJgHPGDgFP6^G,W.`~`^ FGFGFGFw~ ^ G"FŠG#FÊG$FĊG%FŋG&FƋG,W.F̉V΋G2FҋG6F֋G8F؋G:FڋGu_FF;vN u5NM(&G s9FsGu*Fr ^ފGrFs^ފG$<@tFFF;Fr~tF uAM(&W ҋ؊GP$u@^" ZҲuB" "^ފOv:LtB"PTRWRQtt@Y"sFFe^ދG&Fڃ~tG t)_$ćdF֌Fv޸RP^֋^ދG&FM(&G sKF t!6(^ލOQOQ؍OQGP6(^ލGPGPRPj?FF tfNr ~u=t~uFFFFFVԍFNԋ^QOwFNQP^ފG PnF tB^މO&~t#6(^ލGPGPRPj?FFtFs M(&G r1>t*FF;w t NދGFuL^t+Ju/^&ćF֌F، t^GP^GP>u6FF;v% u N^&:D$t.Oqqqqq^&G^:G!t@V^&Gv:D!t@Fs@&G D>7F1^&Gv:D t@&O:L!tA"&O:L@tA"FҊFsX^ހOvt F^w^ލ F^ފ_$ćF֌F، tFt^&㋇f dtߡ t؉Fދ؋O0A`^ހOvt F^w^ލ F^&ćdF֌Fv^S^֋^ފ_$ćF֌F، tv^vrlF6hvbs%FsFSDPdSpFr>iuF[FT>WuMiFhG iDs6hvbFh tFFFiv7UWUYSPrGdSSDPd&SP@ËDlXƇD]h]vPsF#SDFS^ع++NDDF+؍DȰ򪚃dFF^G^dfj^F&wjbrh7FdfUSD~Fs6ZDPPSƇgZG7P~G PZGyW{6~DT DGWD ]PsF#d&FQF~tms]>WuS+;Nv UWY>Du"Fs.>Wu'Fs >[uU[U@16QUN데USSDu>dWDP6b8s4PrSSC^D؍Dl SD~]ˠPsS#SDÃS>Srh7r]^ uP^G <t<uPh7^pFN؎&W&L>N&D&T QdOQd&QPlU[WUF sPPFV LNFQdOQd&QPlU[W]ULN;Fu;DuU;Hu J;\t<JDP6N6L6U<P7LNDFUH\J]UdfhXw@w>wB1jbrh7dfj~www1hbsh7>Wuh7ULNZGXWZ]DP6N6L6U7<F t JP7>[tYU;[tP tUQHUDP6N6L6U<P7DDP6N6L6U7<P7맡LNDFUH\JUF;JuJ] htQFUNPrˋZGyW{FVG}WFVvv"P7ZGyW{FVGoWqGw266vv, 0 JXRP FF@FFF~uDP66v<P7FFFF;FrAr P 66v<P7vFPjFFsvvvN NtFHPFHPlFbvvv FrDRF^FP FF FFFs^v&uFPv ;F tFF=rJ66v <P7F@1vV66R<P7P F^v0~NFNFȉNƄv+N+^0^~9^YFF#D;vu;FuRF^FF66v <P7RP FF^DtpFDPv N ;tLFF=rQvv RP F^D~RNFFFƄRFFFFrOF HPFHPlF F ;Ft0FF F;FrظP vvhFFs>St4SPv F66P<P7vvhU~]F^v&tƃF=rh7ڋFU^GP^&Pvl]FF^ v&ttFN;v\p~^t+JYu>N+FN^ 0~^ 9^YF^ v&FFFF|+N^ v8 UQFhG$ FGGFF;ht؋FG$ FGG݋]UhGF;t DtyFlNh^^^^FF u~thG PFPFFZGw;Fvm~ugF^& uFՋFpFNvZPyx{&W&&W&FF&FFZw uGSFF<~u h7h7PF]UhFF t!pFN؎&VWP$ظPPF]UyDP7]UQPF u NrF]Uh& duh&G@&GuZG%v,]Uh& duh&G@&GuZG%v,]h&GFjFN~t^&G&GFF>huh&GF&t&OuZO%h& ith7h&uXhGlG@t Fs(h&G ZEW&GߊD sD Z6h&D &T t <s 6hD hG ZvshFFFN;wYN^&W fmtAT;lu6&;\u-T>hU|&W &G h&W &G D E FFsv$ hGPdSP7hGPZG7PP7DP7U=&tA=t@F=emt=pmuFrm~-mt@sFmmF=rmt =mmth7rsFj:iu >tmmh&G>iuarhti<u:hu66L P7hmm6L  t@ch t6h&D Gjh;t@&G =dmt"m:u>mt &G G뷚7v;sFh&:G t'~mmt>muo7vh7v~mmuc]UFh&G =mmuhG <t<t G uOhg]Uh&GhGjh;t&&G =dmt&GGѡ]~t2h&GF\ hFFhhFhv$ >thGPdShGPZGPF~uhGPZG7PFF t!h tP$6h5v7ZGW6h&D>hE &| dt/} t)sM hgh&G mPU>uNrh7hhh& fth7h>hh&G ih_]h& fuh7h& duh&th7h&th76hhGPVhGPV\ h9_u'yhG;Vu8h&;Xu+X#hGF^G;huhG^Gh&G f6hD&hV8FFsVFFF;whh&;Fu,&G u ~rmuF s jlFFs &G &Gcs &Ov^Sv &GFFPlFN&OP^SvU`]>uFvFPjT#;RtAV#;tB"ʈN~uB sA>uv%P66 v%P>tFr >uUvjy]Uvjy]6vvF u@>hu~u)4h&uj$~th&G =zmu hv7U] 6FPj~t>( rRFFF F ^&~ s&F tZOuG u~6Z|&ttTrmu us\^G vQj^N&W & v&T&|&T&&L&D&D&D&D&DCA+&L ^ vP7nlZGQlZG\W^G`WbGdWf~t GXGZ#W LNZGXWZFZGWhG7PlFFFF u~u}PFPF uFFZ;Gwsp{py, FԂ~u>hth&G &W ZZGSFFsFXGVZGSnFGUF2jF uF@ZGUlGQvv uZGS2FhGFtptj" ualFVFt ZGdWfF%;tNtFVZG`Wbh&G &W ZhFU6lj]UjP]Ufs2]v`F u"ZGQ;luZSt w tFvUF uZGU;FtFUvUP7ZGS tPGUP]F<t<uRXVu XwV`F uxZQtiX6ZDSGVOXFVnXFFRnZGFFV>nuZG2*ȵxZGD *ȵxEZGGDGQ6XLVOSGUds.3ZD ЋZGoWqGwhF tP6nh|ˋXnGVGXFFu;Vu X;\ufs jF~uRPXwPwNv<FX~utl tiFnZ9GtUFV\XУRTZt-:t'fs jF>F>itXi:huPX t ؍ONG! ZGFGFZGyG{6ZD,T.GWD=XGFG!FG>W@6ZDyT{GB DW>ith t;h&;Xu.؋pFN~t؎&G&W;Tu;RuXGPZGDP~FG F\XVGWRT6ZDyT{G G DWƄh7vZGPvZG7PZGoWqURlnZGQGwi]FfFF>nt{lRX;\th7RPXwPwN6n7<F tNr P6nh|Fr#XGT tRQwPwNnP7<FF tNrPXnGTPh|F FFhGte"P7lF~t}FZF9GwvFVFۋZGSF tPGUPP7묋hpFN~t^&G&WFV&FFVUQv FPv vr P~ tZw{wySP]UZG7PFPhu*vdSP6hv+ PvhFNhP]UdSv6h]U^uS"P7^G@u-vvZt2 P7]U"P76hZGlXZfGQFmF uSFNfl"F u2Ff~tl"F uFf2vv8P|]Ul" u]ðR򪚓lRRPXwPwNP7<]U "P7lFZFFFl"F u>Ffl"F u F2Fl~uP7vv8P|]UQ#FZGXl u@~tA"s(l"ˋ]UQQ^uS^ tSFv+v]UQQlFFds^F tWPFPP7FFZ;Gws$p{pySP7F΋ZGSFF뢋]U>hu48iu%8htXGrh uMXhGr<5h&G$u@bi:jt@FPZrv]Uhl9GuuG :iti:hsFrmv8]UQv-sg&GP$ u@FYtA N>htB "Frh& zt@FFsP덋]Us2& thh&;FuݚP&v]Us$&;FuP&]UhFFFs4F;t&;Fu&G@tۚP&ËFFFh]UQQjFFN؎& zu P7^& mt P7^&t P7ZGns P7]U^pFN~t`^&G&W 1 FFFHN;r,^&w&wQ<P7>t P7Fu^&F뚋]^ug^ SZGPF tPZG7P^G^QPZGDPW LNZGXWZ^ S?P^wZ2jFFN؎&_^uZGXGZ/^&GF^G^QPP^wZ^uG^SZGPh8s%^G^QPZGDPj8rshh7FlFF tLPvP7j^w( u^Sgt~t"PZGSFFh7jFFNjVV^&؎&;th7^Gl"P7v^ u#F t;Fuh7^&GFFFlF^SgFZGSF~tA uB"sNANPQP뽋Ft Z@M:^SOFu(3PF^SOFuh7fFFF^SgFu)F@FZOSN t QPPh7ŋZvHMfF FZGL<s1tȸ31FZOL31F^&;rFFZGLN;v,vP;VsxMu VVNFFFFă~uRZGL;FuDFZGLN;v F@PF@PFЋZGLFGLFt"^SfZ@PZv@MFZOLtR31FFZGLȴN;r/xMt"~Wf@Ph8sFFuZUt "PFFZGFFZGE;Fu3F@FNFOSN t QP3PFZGEN;r&^^?u ZGEFFuʋF^FGZGEfUt "PZUt "P7Fvv(F u)F@FZOSN t QPPh7ŋ^ZOEfUt "P7ZEtXUuGFZFFZGEȴN;r+^^;FuG;FuFuøUQt P$< v !P$d.6x!(d⚙ۚa} v oh!P$]JVJO H A5 :V 3 , %9!P7 M(&GsO&rH\bw2؊|`=t"\^P\PRPPЀF]U>?uPPPFgs`r P76KP7> v P7S6FP+ \P7F u P7F FVh tWRP PvvFPFPP]UQ>@u 6hPmmPPhG <t <t P76hP>@u]Ut P7PPPh u P7S6FP+ \P7P66h&GPFPP]UQ6hh t P76hP]UdeJe]U S6 S6P6$P76V7FXGVll;tP`ZGSlGF6l`ZUt P7Zw uPЉFVFFwZFVFuۋZGoWq;Vu;Fv P7Zu P7Z3OuIOD OuIODWOQPr P7PZGDPPr P7Zwt2FZGwHN;rp{pygFuӚZwt2FZGwHN;rp{py9FuӃ~uZGSXGV ZGSFXOXZGGQGS2F tlP`FZGS2]UQQ&NWQP>hu&Gr P7atAQ=&t@PS6~pmu &O@]UQQ6W&GtSh tLG@uD=Fh&G;Fr hF&GhPFhFuӚ\ hO@P]U6hh uNhu P7hFPWPh u P76hvv S]UQ6hh t P7hFPWPhu P76hvP]U PrmPPhG <t <t P7t P7 FhpV^&T&|VN;s;v P7S^&w&wvvt<P7Sv@$P]UQQ6hF=pmt=rmurmP~pmu[&O@YhG@t P7RPPS6 P6$P7h u`6,&g]Ut P76hh t P7"P76hFVhOyvv66QFDFhG$Gt6PS lF=u &Gv7v7]UFtv P7~u PmmPrmPP^. . K hpFN؎GFFFRh&GFFF^F5hG t ^FN F^FFF&F9FvF>vNFYP]UFFFFtt P7PmmPPhG <t <t P7>lu 6h"P7^., 0 b $~s P7^&FPKP7FZGW+~ v P7^SvZG7P+ \P7>lu P2PP]U6>tApt@ Pb]UQ&6hpFh&G mP8FS6 []U6h&G$&]U6hs&G% &G% &G]U;)v P7!P7]U66G]U>6rmPPP]F^&t5PFPF u+F ^&O ^S^GP^ F^ t,^FN&b&Ob^  t^QP^Sh8 ^&?u@FFsv Vv ^S |`+F;zrF;bvNrd;bv Nr^|FNFNF;zsc^&GF& tBFO;th7^GvNvFYFFFFFF딋Fz+|`+ȉbzFPV£zb++£bY^^GUv vQi:hw2i:jtv&d&d(fii]hS6 S6vP$P76V7lbkdfhidF&Gs/hvhvvhvvhvv^tfQu+JVX*ȶ@tu!.uasNFAQPhF@NF둊Fshjj^Ft*S^@P^HF >sh7Fv vQFF^FF^FF^FOZGF^FwDJNZ^F&@;w&Sv8[^FFi:hvhu v&vd&dfhG^FNFBF^&@;w¶Sv8^Fiil&iU~t*t t=HuZrv7]F tV=r =wP$h t7>t&tA&9u@ FFFshv~u >uF~ut=IuF~ui:hsFF&GN=uD&!u9_r2r+>u sNFFs!,&G&Gs v2FFs6XSdF Sl4~uC&G t at=&u,r&G=rmt =pmt=emu &!tj hurY&GFF&ON^&?{u'}u+JVF+HF@FFFhF&9GrU&HN&^FI&8*u;Ns+S^SQF;Fu^S^SPtuFuU^v]Uv & ~^Y]FF9Fvs^ &^&:t^ArZv ^ v& ^ v&,AaF^v&F P^S؎F&PttF P^S؎F&P$u^ &F^&;u^ S^SF@Pt;u^FF~t&FU^ v&7]U^v7]UF%u+Ju]UF ^GFG6Xt ^Sjn]Z<t<uXG>W@ vv t@FZUt "PZGoWqfFF FVZGwF tH@yP{ XG>W@"P7~ s9vv u*F@Z;Gwuv拀;Vu;Fu8F@Z;Gwu)vp{py, FZGwFF"P7FVZGoWqfF V hw FV;u;v{ZGw tHHyP{ FV+FVZ>\;u;w@FsN~vvFNV>;u;r+F~F Fu~tZwu~uF~u΋ZGw4HHyP{9Vu9FrGwf uGF?N~+׋6Zf>F~u2)FV66RP, 2~t*"F uZGoWqfFFD~u FsFZUtonFvcF uZGSfs,Xwbw`6 <F t P6hm|F~uFFø"1 FZGS;Ft'~u! uj$ZwSGUPʋFFV FFFF;Fs~uv v P <FFދFUP7]UAvAX9Odw]s1Xwbw`6 <F t=.t P6hm|Xwbw`P<F tP6hm|UFPX%VR £X %] FVX)GlWn)66mF Ft5n^S㋇,Ћ!X@rʚá uXGjGhGfUF V N~>]FV F8Vv v mXGd;wj$F Ft96拇,uh7n^@rƚZ<tA l<t@  u"Z$ tXGfGhGj 66mXGd;wXwdhlF FuXGd;Wnu;Glw@УZGw6拇,#uw9u9v>@rヿu9u9wΡXGlWnP  X £9Vu9Fvx9u9w$XGlWns @r6拇,#tgrm>t >tX tQ> >tGHZf>t)FVO>ta> r$3F t vf6V桨Z@yP{X@Gwf;rZ;u;sj r+ZNNOO6 r rH36Z@yP{;u;rs;rZHyP{ uNFV;u;s 6ZfFV+FVAZOwf tiP> r  u T3F t vf;u;vFV FVXGlWnv v mX9GdwPZwh|F Ft6拇,tj6h|S6拇, n^X@r&u{&w&7m6拇,u &Gˋ㋇,Ћ!X)GlWn)&G&u&w&7&w&w, &uJl&w&wF&&WP7F&GP7&GUFĴF%?]UFĴF%] rvFPjF uV~tw~usvn&FN~t&^&G;Fu&@G rF^&GFԃ>ru4vjFPj;F u~sFr FrrU&G&h tz؋OlO^dfG ihjh&\Z_&Xa=CPtA#;°t@ ^h&G$u@b]6-s0h&9uN;tމFhFh&GhnFN~uh7h^&^&GF6j'>ru*rtsPl FnFN؎&G n9Ft1&O ;ru&O;NvF&G@F&G ǁ~s:6-s"&G;Fw>ru&G@Fс~ssF^&Gr^&G &G^&GF&G>rt3^&G F&G ^&G F^&G F^&G FF^&Gh^S$~rhh7F&GFv-sxF;u&G&G&G t:nFN&W ؎&W &G F&G ^&G &G &GhS$h$Fru v v y>rth6rl nFN؎&G nFNF;FtD.^&G ;ru&G;F t"^&G;F w ^&G Fʡnَ~tXvFn&FN~t&^&G;Fu &G;Ft^&G;Fv F^^&GF¡nَU>uvnƃ &G>t!&G;Fu&Gհ]U>u G;r&Gsٰ]˰]UFF;w&@sFFuڸ]UF t";w&Gr]v-FFv-sB&G&GF&G^&G&G^&GF@XZG$sFF6ZFPQ|F tRPP<F u>UuZG$rFFFs>FFw.u FVFuFFFF8FrFˍFP6Z|F tFF;Fv9 uAvvP<F tl t6ZFPQ|F tˋXFÊFŊFƋFF=9|t=CPtM(&GseX$u@FɸFႿuF#XF9wANHsFXF㊇F䊇FF$XF[Xu.ZGsFXGw$u@FɸFXvuF"XGvF9wANsFXGuFGtFGxFGzF6M(&Dr [u@FˍFP6Z|F tˋXG.W0FVRPj<F t˚l u]X=9|t =CPttFXG.W0;Vu;Fu2GrˋF=-tZ!uˋFFtFr lFV~v XG:W<lXXw0w.j <F uFsXw4w2j <F~.uR4Xw0w.j< u7XGrFGpFZG&XXFGrFGpFUj9]FF;w+^G&F t؋Or;NuGrFuU u% t!;v 33733%3 ҃+@sH]U؋]^w&w$6RP6^G4W6FVONQA6FRu+JV(FFG$W&_Y+׉GD+ȉOFG*;vGF^G*OF;wBVW ;Ȱu@"ˆFG% u@Fg{G*+IRP6RP6FLV^;W.u;G,v^g^GtG uFs^G %=uFF6f6dFPFP^G,PG<PFFu+JB.!<Mv$/^G tFsSFPsvDvTFr ^Gu^G %GFs^G uSFPsv^G rSvx^G u Fr28v8]FszQv9^G u8uFsSFPCv #^OFrS{ F^G^GFVG*+GFF^GDGFFr?^W6f6dSj FPFPF uF;w ^GF^GF)F^GFVG*+GFF^G s F;rR^GDGFFr@^W6f6dSj FPFPF=yuF;w ^GF^GF)F^G*+GFF^W6f6dSFPF=t ^F)G*F;v)F^OGFVFFFODOF;w &|WRjiFFFrKF^&O؉F^&FF;vu;FuF~uF뮸Pvh^G@PFPFF tP$^OS^GFG:G8GPu G tS ^GtGDG@WBG0W2G^GFVG8OD;v+щW8v&G@GB^GDv&D&L G,O.^G tGFF&O؈OJ>JuFJPJU^O ?utj$^Gu"><u< >FF>B">8uF8 :FF:@]$^G sF F^G u"GF+G:GOFNЈFFV-^GF+G:GWFVGFNЉFV^GuG,FFFF^G0W2FVNЉFV^G8FFN^FPF t^GOwS l^G8)G:uOwS lL^G:G8;vO8^G@FF& O@GBv&DG,G.;JuJvU^G GwS l]^G GtGDGFG:1V t+O:^GtsG:G8G@WBG0W2.^G8GFVv&DG,G.v&G@GB^GZGuO^O8^G$W&G4W6GFG:G8GtsGDG@WBG0W2G^GFVG8OD;v+щW8v&G@GB^GDv&D&L G,O.^G,GHGJS F t^gSF^T?tj$^G> Gww >BtcBF<F~tN^^Gu G;Ft^ۋ^^ u>^B^OSF tA^tOwS lL^^ u>F^FB^G%Gtg^GuGFO8؈OZ^uGt_^F&GvK^Gu GGGDGF;GXv,vq:^GX t"GFGFFO&LGSd v^G^G rSY8FPwFF ^GtGFF&DGv^GU^Gt1%Gu t G^Gu GGS v^u SwFF ^G]^g8F^;Ft uj$^^ u:^@^G s^u5Gu-t wBw@F tP$^gv_^uGt Sw8F v6v^u%SwFF ^GtGFXF&DG^GUv v ^S ]f dt9~u ЉFVFFFFF]^$ u "uG"ЉFVNNNAFu+JV(FFFFV6f6dFNQPFNQPvvFNQPF t =ztP$Uf du ^&G=P Nt ^&G/)^&G sNPj 2 ^Sl]FF>t}FF;wqF t[؃*uFOr?&t9FF(FF6f6dQNQPPFPFFF^*tFFu~uBFrN tPlУNP^&GxW^ Ssl^&G t&^&WNىGQ A^G6u+JV¹NFތ;u;u/~FFsF6DRP l^SKl^_^FvDD D L\dNVL&&WL$T&L4T6L T"DDDFD*D(\^G8DZV tF>~t@Fs ~F R(F ;RuFX VuFVXF TvFF;Ru4~s-\~RVFF tУVX6T^jlFR t؊_$ć M(&Gs#&Gs쨀tFF t^vrlFM(&GsF@F'FsF F  ''F 'F ċ'F 'F 'M(&Gr&Gr&GsFFP'Xċ'M(&GsM(&GsT' F'FVv U'']U졮' ']F'*'^'^@'^'^vF>t@FsF *ZF^`Z@%Z;\uj$vFFF:u1\9Zt*ć^FF\@%\v^j$vn^ F HF F'Fs' ' 'F 'F ċ'F 'F 'M(&Gs.F'$u@'T' D Fs3V#M(&GsFP'Xċ''FVv U'']U졜' ']F'PZ@^'PY^vU] >bt>`t6FPlb6FP`lF FuT~u v ^& u S uP ^& u S ^&G;uFFP ^& uS4^& u S ^&G  u+Ju ^&G^S Ft^&GSl^Gt tn\^G@t S Fo^G%_GtS *^G tS ^GtS ^GF^G u~u S_ F^G uS ^&G tF_$ďNF^S^ ^SFP ^&G u`&GF=rmu ^&g'~pmu ^&O@6^SdPtl-^&FjFN؎&G r^g^Sl^&t 6S l/&!u^& %u6XSdF ^Sl>u ^Sl)^&GF&G FF8 t/FF t%ONF&L;NuO F^у><tW<F^F tEONF&L;NuۋF^G^ u>^Bv 미FFF;vF tB؋G*F t/F t(ONF&L;NuO F^Fы^(tbtOFF;bwA6FPl^&G;Ft 6S lF^&GSlbFu6RP l6FPlF tV~tE& t<&G;u2FF؋O@u! uONF&L;Nu WF6^S6RP l6FPlF Ft5FFظ GuONF&L;Nu GF6^SN t%&O;NuF&GSlУNPF^&GS{ M(&Gs_&sFFFA^Gu+JVPNQRPjPЀF^G sPONF&LNF~t5 uFFF HFjFPjjjQЀF^#uG6S l!^GFFތ;u;u S^G uG^&GSl_6RP l6FPlF t8^&O&;Lu^G^&GSl^&O^S{ v 2v&| W &^F^&F^&tNF<v#F<u^&wFPj~v}^&G&WFډVFFtb&G ;wQFh^&G P^XP% u@FXP%@ u@FX%?v&D Ĵ;G2uM^SFP F u8^&FjFN&4FFs^Gu^G$<tFrO^OFP% u@FX%@ u@FЃ~t,^&GtP$ u@FX$u@Ff?FsL^@GuB^ tG u6^&t-Gr&rGu^ tG usFFt(^G$<tt<t<t <t<t< u.F<v!^&GFF t&Fڋ^G6tu^&Gse^&u{^&G^G6tF<u(^&Gs0|Fu^&GH&GFs_Fr^#u,~Fty^G$<t< u^& ut|f dun^& uuB^&uU^Gu#vT uruu r! F u6^S t/by^GFG FG FGFGGFsOFs^O^F GM(&GsFFFFAFu+JVjFPjjjQЀFFtv  tFt ^& uuJ@^Gu>^ tG u2r+^&t"Gu^ tG us^OFlu^&G^GG^&G&W^GWFڋV܋^G W"v&DG(Fr vD8GZv_  tv ^&G F&wFPj~u F%`;Ru3F%;u'^&wF%PvD^F~u>^&F tjFFN؎& zu^&uj$^FGLWN)GTGX6M(&Dr uFF^G$W& FVFF Ft n^FVFHFFA^Gu+JVjFNPQjjjQЀF^ uFF^GV HFjFNPQjjjQЀF^GuxFG W"G$W&)G()G*G tGW^FGOGHOJGO^_^F&GFF t؋F&^G$W&GPWRG*^FG4W6)G8GtG0W2b^F)G:8tG,O.GHOJG,O.?^G: t5O@NF&W@GBv&LOHGJO,G.G8;vO8^G4W6GPWRG8GV^(uBv ^G u0f dt^GFO$t tPv  ^G u<u^G W"G$W&G(^G W"FV_ ^Gt O#^pFN~t|^&G&W;Vu;Fwp)FV^&F^&G&WN~׋vD$T&&G&W+׋L(;u;vL*^&G&W+FV^G*^g6RP l6FPlF Ft v  ^G@tG[GGXGT&\^GtdO4W6OPWRO8OVtg^O@G,GHGJ^Gu^G0W2GLWNGtf(^Gj^G$W&GPWRG*GVG t-G% GGWGLWNGFF&O؈O!^G% @GGGHGJGLGN^GF_$ďNF u ؉O^O S^M(&Gs j j\FF tP^r1FF tP^rFF t^M(&Gs j j\F u^`FU^?tj$^`]^G*F t O*FDtV l֋^G(F t O(FDtV lU^GrG6S l]f dtA^G@u'S^G <u1u+SwVF ^O^gwb^G^uGt^wS l;^_^G(F^ tFF^^t*t vj<^VuO ^GFOPWR;T.u;L,rG^G(F*tA uB"s/G* O(FrSƋ^O@wS l0^G*Fҋك|PDR##ЉL4T6NVQA6Ru+JV(FF_X+ߋ^҉wD+ƉGFOV;vOFV6f6dFNQPj^ҍG,PG<PF t=yt^ҋG tsF F^G@tGHF،FڸЈF׉F܉V$ЉF؉Vڋ^ҋGLWNF܉VފGF׀N^ҋG,GDO.FNFFGFFFN^FPF t26f6d^w>w<PPTFЋ^!G~u ^G tF^҉GwS l^G*6f6d^w>w<PPT^G uSwFF v^GFu GuP^G*^wS lvhF t/&Ov L!D$ щL,T.D6&G D> L L^ gߋG>FS&&^ rS %^ G"GPGPGPGP FU^G v&DG!&D&Dw.w,P^&G$&W&]U^&w&&w$h^G,W.]M(&G r6(ZGPGPRPj?Ptl6(xZGPGP^GP^&P?F t/6(ZGPGPXGPGP?FFZ&uh7~ S6 RPPjP$P7> vh7t F F~FPsh7FPP7Xv h9F tXGPFv7hGPFPPtlXGr th؍GPFPPtl6\ZG&X u S ˋZ%tj$ZG&Xwp,XM(&G s'6(ZGPGPRPj?PtlZ_$ćFF t6Z^6Z  Z&tˋZ%tˋZrˋZG$s0Sj|F=uFFFsZSj|FF tPZ$uFFsSjZSj|FF tFs ZSjZSj|F~tX؍GPsFF;vXtX\Gp6Z\&D#>M(&E sH6(DPDPGPGP?F t"XXZG&)Z_$ćFF t6Z^FFt/| sFPlFFFPlSLF uXFF0FFFFFFF FFFFFFFPlSlvFPlSlFFF;w.^tGPvjsFuɰj$^tG u2 FG LNيW UW UT$ t\]EU$M@u|" | tT&H^Ww$jG PG&PF tP$s^G&^G$;G&ug?^OGG8G:vLDOGG W"G$G&^G W"vD T"G&D&^GGCvPD(^@uVFNFNQFp^G^H NF HNHP t$N䀀N @PRRֈVYNPĈFXFY^OBs >v ^>vFY^G8vD)O6jj$)^E(^CO0w1n^E ^G FOj PZr^G% G%3 t@Fs^Ot8WWw$lFP^w"w w&PP^G&P?XċAGuE^?uE ^E^O@j&^Gt uS$j PZj U^(uG(G)E^?AE]^. tG(G) G0OF^O1":t8Gt4^G1$GW ´@ZFDFG ts^Gt3^G F^ t;Fu^v^G(G)^GvDDG W"D T"G$D$G&D&^G F uS+$m^1u:^uG^G t vD8G*9^G$v+D$GjNQjNQPFPFPFPjhF u<~u6FϴV+Ѓ r"FNϵF؋G PY͵ FF^w>jFPjFPj$FPFPFPjhF uV~uPFϴV+Ѓr^GtS^ u  ^uSvQ^Ot  g^RB2 ZRZRZRZRZR ZR ZRа ZRZ tS^G t{F9G u O ^?uvDtS,^G^Gu^G^Gt'vDt u )uGFPw L^GGg, ^G uS,UT^ GuƇ^Ƈ^<^D^^gShLv L]^ t G GG^O2¿&u+JWuh|$^GH<t шVF^R ZR ZR ZRZR3 )ZF^GH<t шVF^G FG( uG) W^vD GF]GDDG$D$G W"D T"G&D&G(D)GtފG(@)G(-^OtG(y)^G(^R ZR ZRZR)ZFF^?uJ^ u+ t쨀ut  usF;XtjF붋^ tt  u>^ t쨀ut  uF;VtF뛋^  RBZ gF PZ @PZ ‰vR ZPY ^$u $9^G@u2?u*RZ P$YFO+ȋWOWG$(^?u*F t!O N t~GtuG8W:G8W:g^G&+Ft5O N t+Dt"W\8SPl^FG8O:G8O:^GNWGW)O$O W")O&^gF?tA uB"scRB ZG$;FsF^Nl^GNWGW)O$G&;sF^FG W")G&^ tRB2 Z^RF"ɱuANVRP_ZR8ZRB0 ZRF$^Zփ ^G F. ) u b ~u v^Gtt4^$t;^G@uFv΃~t‹^Gu uG뫋^$u vDS뚋^G@tSvt낋^RZRBZ^O+w,n눋^ tPRB(Zu $^ DOFr Svqs^럋^B(G(<vlF^(t?Sv7s4^(u  @^G(v+@)O(F븋^G)":uTNIw*)C^(uG)^G(^ @Fr Svs^G)^G)":t{^G)<t< u ^Oc^) ugS^w)t+Ju3(u ^w1t+Ju O ^(t @G(^B(vvs^ u G8A^u $^R G8G(G)OZFF됋^B(vvks^ t5u $^ G(G) G0O^Gt FvFF^ u) u~uF@F;ZuS, F;\v\^$ t@U^G(G)R $Z ]^u  ^^B^$t*F^F(uF@F;^uS,F u^G$=sFFFs"^RZwNn2^u  ^Nwo^GNWGW)O$8 ^u  ^^B^$t:FF^F0u*F@FNAN;^uڃu S,FFu^F uF^G$;FsFFs^RZNl/^u  ^Nm^GNWGW)O$^&u&Ww$jG PG&PF tP$^?u(`r!G FDt|8WWw&lF^  ?u  ^ ^G "PPX G&HPXXNjv ?u  ^^R#ZBOD ^O0@1G0FO1":t8Gt6^G1$GW ´@ZFDFG ts^Gt3^G F^ t;Fu^v^G(G)^GvDDG$D$G W"D T"G&D&^G F uS[m^1u:^uG^G t vD8G*9^G$v+D$G^’^žtSPPP 4v4FtR^ F tS 48Ft v4(Ft v 4Ft v? 4v 4Fth^jSp P4^’^.\pzv` 4`v4V^ Dv4:vh40v4&vhv4vj4vC4Ft&^R’Zh쨀uS)4vC4jFP؋žPœP4!^R ZR Z’G uƇ ^FFw1Ȱ^u  Ѱ^ VFuNj^<^D^^gߋ^žtSPPP 4֋^œt;›FH t׉N@ N G vw F^F9rSPhh 4FuF^F9r(RZRšZ  nFű^šS L^RhZRbZ‡$S4^$R ZR$Z’bjSžPœP4^FF^F9rPRZt6v@ t,FDtSC4vvhh 4Fu^RFZ‡$S4^R ZR$$ZR’ZRbZF;w SPhh 4^‡$S4^F@u SC4^R Z’Fu Sj"4]F$uFF;w}^G$<t< t <t<t<uQ^G :FuFG!:Fu>@u8G&F t ^!u^GF^G^G"F^G!FFtzRPQvvQ^SRPQ^Svh-mcF t~ư$vPVQjNQj$NQNQRQPhF uK~uEFˆFF~uFF ;FsFv~ NN FȋVN V^&)F vfF~ tFt{ 6&FPl^& u SDL^&G;&u vL^&G \u+JuFv&t V &^F^&FĴ.^SLp^Sv La^Sv LR^Sv LC^Sv L4^SvL%^SvL^S L ^SLLFFt^&GSl^&G&gFFF;p&vNNj&^wXj\^G tFGt FFuF@^ZNOOuINtLXZ^G tˉF؋F9Gv)G빋^tGFOGvD \ 됊FsFs FPFP^wXj\Ft ^&GF t7&t. w & &^ w&FpM(&G sOVFNFNV^V^j QPjSR.lPtl~(Nu+JV tu&&˷F&6(&P&PRPj?F ^GB uFDFd<ߋG&F t ^!u^GF^%^G!F^=CPt #;u^O< v& ^=F^&P +ȋ^^x>^GFFG t6&|& |t O+&;Lv ^G'^O+w,^&^&GFF t ^O<&^&G$FF t ^O)&^G uG^&GSlvL6&RP l6&FPlF t^&O&;Lu^G^&GSl^&O^SLt^Sl0^&_S^&wc LF uu^&G$FF u {^&^&G ;p&v_^&G j&^v&| u Guw^&G <wv:Du_^&vP^& vA^&-mt@Fs&Gpm^& t&G=pmt=smt^&xmtF^& uvD^&G & GFv^@ZF u LF u~!vF^@ZF^FF tGtFދ^^G+Ftv&D Sj&[G&D F~^&9O"w=A^G~ҹ t+Jt^&_S^&wjFPD \^G=:Fuw>~ҹ t+Jt^&_S^&wjFPD \^G=:FuCw>~ҹ t+J%^G=v&;DuO>Q&|WPtt*^&O"&w~FoL^& u}^&%l&F^ G\^&OL&pmuD^& uvL&G D *^GuFs ^&G ^&G ^G ^Gu$~u&~u ^G F^G ~uM(&G rtF^&8{u }Nu+JBV)VuK^v&8[uvN&8]uFn&N;u^vP&PQtu^SFPvLF uk^t]^GFSL^uBG<u?uuuv!^?ut j$^uSL^SFPvLF t ~^&4 GF;vN^& du^G $@t@FGFLND ًPG@v&D.GBG*G)SF% u@PTL^&G t^&O^&GFF t&^&G$FF t&^&G* t^&O.^SFPvLF u*^_^_^G@tG^&GtX^wXj\^GF t؋F3GtF^O~urLF u^wXj\/IF^GG&ONO OvL ONOwL O(&L tOGv&DG$F%^ GGv&L*O>G@v&L.OBG)uS#N ɰu@PTL^G0FG/FG.FFG)G$N~+^PG HxX;Vu;Fs ^G)^G$N~;u;vO$^G^G^G F^ uF^FP^wXj\^&G t^&O^SFPvLF t^_^_^wXj\^u(^& uFh^GFG GFR^&GFF^O & _^v&D& Dt G+&;DvF'^O+w,^&^wXj\F^SFPvLF uC^&Gr3^_^_^wXj\FP^wXj\^&_S^&wc LF u=^&O&򪠪&^&;Gv'&^&&^&t 6&S l:^& ru SL&&!u^& %u6XSdF ^&GF&G FFFFF;p&vj&^wXj\F@^ZNOOuINuMXZ^NFF t؋O;NuGF^F߃~t^GFF t1ONF&L;NuO;&uO FN^Ń~t^GF^ t6FONF&L;Nuۋ^vF^^OTN~t^G F^ tFONF&L;Nuۋ^ Fu+JtF؋O;&u"O F^vF^^OVN늋^wXj\FtOF tPF؋NFG_^GHGuj$^G;&uSL븋^wS l6&RP l6&FPlF tH& t4&G;&u*FFظ GuONF&L;Nu GF6&^S뜋F^&GSL^&GFFF;p&vj&FF@^ZNOOuINu@ZFF^F t$F؋O;NuuPLj$Ћ^uG<u?uuuv!^?ut j$^uSLNFt(^^ &G F tgF%;u[F%F;r&wLFl&F؊W u3v &|G;u%&| ft""Ұt@N ɱtA2s&^GF t ^u F^ ^G_^G_^_^wXj\^G t`WB tYGOOGW$G&G W"O+,|^9GBw^GBG0^O vD \ r^tEvDu;G<u5D F^ u^O<@GvF O^OTGV^_^Gu^OV^uSL#^GHGuj$^wS l^G F^ uF@^ZNOOuINt8HZNT tD<uÀL<@~VDOTGV^OF@^ZNOOuINtXZ^G tPv L^g ^GFONT VF tgD |&DFFيW &^&G& GtيG+&;Gv ^&G'^O+w,^&^Slf&F u$^f&`&L^G@FU^?tj$f&^f&`&]d&F t؋d&^&JF^GFG<tW W V^G  G Fv^@Z;Ftj$v^@Zd&^d&^&h&F t ^Guˋ^h&b&F+l&1 ^GFF^;FtF^^^GHGuG^^Gh&h&b&UfFVv ~VN$0$0:u u ъV ֹuu ׸]u u3]85Fvj$~rA6h>v h& mu@Fك>u&G$t@ Fًh9GuAN؀ tAN֡u+JtAN׃~uUNs t th tuFt^NrWNsHt u>>Xu?5Fr6Fs/Fs>t!Fr>u 6hhFs "P7&>vP^.msFFF> u.$+29Qv#vF^{FVFWFhFs!ZGWr&GuhF7ZG7FrF\kF`dFo]FFFsLF7E>XuhX^^FF! Z^^F`FtFF@h6FPjF u?^ɷ.F^ G FFFF tPF rЉFVF> r[hG $ôFsNsN FsZG$ô F> r F&SF&ЉFVF9 r&OɱuAhW@ҲuB "&dFFX \ЉFVFAЉFVF> r)&6&DtP$ Z" &FtZF^v6 l>vFY N;r j +Plv8Ȱˋ.. ..2.F[jV&7KPbljWjsS6 ZG7P+ \&Yj\j`jhG$ G>joj5>l rZwu,jhhOqh6 j@lPn]> uXG8P&G7PZG7P+ \P7jVjj\jjojhyj;hjhj@h&> u& th&ZGnsh7&G$6&<uA &G> sh&&Z^jU> th&&G$$ &G6&s &O&s &O F6&blFrFsjFso tYtTZw7X! h9PblXGrh tjZ_$ćFF u6Z^ˊFsFr2ˡ`t6%P 6>u>>#sj'6FYn;nt &G%&G&jFN~t`&&W ~U&W U &W&T&W&T &WU &W&D&G&GE&G &G&G#Fڃ~th^G^F܉Nދ؎&Fڋ&;wAv& ~ڍy%^Y^&F@F&G#^&GF`t &6&U N;s)v+Plv0Z~9F&]UF; th6Z~9NF&] > F6%P>u~sj'&jFN~t^G&~u^&F^&uFF~tg^㋇&FvL^NV& @~;w)Q+&Wlv8vFYF^&GF듋^㋇&Fv^O@;Fvˋ^GPvF+&Pl^w~9 ~ u~ 6~v~N F r7F tFPv `"F tFPv  FPv kPPFPj ^^& U^ Sv 6b^SD \] ~ u ~ _~ vW^s,F ;r;u^ &G u^ Sv ^S \!^v N FYF ^& F<tj$.AKmCt \Fa1{Z%thPbl˰>tJ\\9r<Z t%؊OsG#F{FZG\u4Z&uh t uhhQlX>S6j!>Z&thZS6|R/>uZSS6ZSS6|FFFS6 S66P$F9VuPF&G~&&^&^&GF& GlthF;(s\&GjK6\ZG&X u/t6O{O{uG{M(&G sXG{~&0XG{XM(&G s-X$uƇR~&0XX$uƇX RF6FPjF~t˃> thPs&tP&Gtg&Gtt&G t& u&tBf dth/&w &wP F tP&Gt hs&GM(&O&"O% t@"&G&W df&GТRPPPRQPPdPF&GP&Gt&&Gt&&Gt&&9Gt@9t:FF;w,F t؊Or 6&LO8Fu&G&WutZ\&u&Ghjˡ%;(s#666S6 SD&qZSFPQ |F tP>4 +9w>vZ&th~++9w6~FFPZS|F uf duAM(&G s&rS6 S6RPRPjFPx u[vvP  u &GtvvyF&GFVdfj)jFP/|F tdf^&&WZ&uhR &Z&uhs?&wFPj~u& tңhh&;\uh!븡wdr_Xt$O{NG{h9F tCXNO{,XFh9F tXNPh U`rh]6V &^FF^&@uFS6 Svj6$PblV=tPblUF;Fvj F+FPl^v8Ȱ]U&>Zt0]\\9rZ&\uݠ&]UZ$u?GXt8GVs1G@&;t&@;t!O@&&GW  GW{ t@]ð]UD&&K(&&&~u&F&&&&QP&P uY& RPRPRP<&& RPPRP<&]6G69Gw6GUvF~ F ;uV^ :t3]Uv<\DD&]&E؉?G]Uv ~D&}u!&&EM(& v ~tf3ɋNfff N] j$UVfff]UV fFf]hLjFP/|P7^&&G)6 j P7fFFPP..U3ҋF vȋFv]UFf؋ʋF fЋ]UFf]UFV v]+UFV v]Uv&D3v&D&v&]UF%]U ]UP$]U ]U>r)u((PPFP/|F^&^F>r)6r)SdPbl4] LIBRARY: <Gen>Clstr.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:49) LIBRARY: Init.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:51) LIBRARY: FileSys.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:46) LIBRARY: OS.lib VERSION: R1.1.0 (tuesday november 16, 1993, 1:47) mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm5 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm5 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm6 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm6 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm7 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm7 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm8 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm8 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm9 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm9 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm: mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm; mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm; mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm< mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm< mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm= mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm= mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm> mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm> mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm? mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm? mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm@ mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm@ mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmA mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmA mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmB mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmB mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmC mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmC mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmD mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmD mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmE mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmE mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmF mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmF mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmG mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmG mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmH mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmH mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmI mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmI mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmJ mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmJ mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmK mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmK mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmL mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmL mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmM mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmM mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmN mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmN mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmO mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmO mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm