Revision: 201027
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 15:50:07 +0300
changeset 201 43365a9b78a3
parent 200 73ea206103e6
child 211 9546f80a8597
child 247 d8d70de2bd36
Revision: 201027 Kit: 2010127
kernel/eka/bmarm/euseru.def
kernel/eka/bwins/euseru.def
kernel/eka/bx86/euseru.def
kernel/eka/bx86gcc/euseru.def
kernel/eka/drivers/bsp/bld.inf
kernel/eka/drivers/locmedia/dmasupport.cpp
kernel/eka/drivers/locmedia/locmedia.cpp
kernel/eka/drivers/pbus/mmc/mmccd_init.cpp
kernel/eka/drivers/power/smppower/idlehelper.cia
kernel/eka/drivers/power/smppower/idlehelper.cpp
kernel/eka/eabi/euseru.def
kernel/eka/euser/epoc/arm/uc_utl.cia
kernel/eka/euser/epoc/win32/emulator.cpp
kernel/eka/euser/epoc/win32/uc_utl.cpp
kernel/eka/euser/epoc/x86/uc_utl.cia
kernel/eka/euser/us_exec.cpp
kernel/eka/include/drivers/locmedia.h
kernel/eka/include/drivers/smppower/idlehelper.h
kernel/eka/include/e32cia.h
kernel/eka/include/e32cmn.h
kernel/eka/include/e32std.h
kernel/eka/include/e32ver.h
kernel/eka/include/emulator.h
kernel/eka/include/kernel/kern_priv.h
kernel/eka/include/kernel/kernel.h
kernel/eka/include/kernel/sproperty.h
kernel/eka/include/memmodel/epoc/mmubase/mmubase.inl
kernel/eka/include/memmodel/epoc/mmubase/ramalloc.h
kernel/eka/include/nkern/nk_cpu.h
kernel/eka/include/nkern/nklib.h
kernel/eka/include/nkernsmp/arm/ncern.h
kernel/eka/include/nkernsmp/arm/nk_plat.h
kernel/eka/include/nkernsmp/nk_priv.h
kernel/eka/include/nkernsmp/nkern.h
kernel/eka/include/nkernsmp/x86/ncern.h
kernel/eka/include/nkernsmp/x86/nk_plat.h
kernel/eka/include/u32hal.h
kernel/eka/include/u32std.h
kernel/eka/kernel/execs.txt
kernel/eka/kernel/sexec.cpp
kernel/eka/kernel/sinit.cpp
kernel/eka/kernel/skernel.cpp
kernel/eka/kernel/sproperty.cpp
kernel/eka/kernel/sthread.cpp
kernel/eka/klib/arm/cbma.cia
kernel/eka/klib/bma.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mcodepaging.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mdatapaging.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.inl
kernel/eka/memmodel/epoc/flexible/mmu/mm.h
kernel/eka/memmodel/epoc/flexible/mmu/mmanager.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h
kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mmu.h
kernel/eka/memmodel/epoc/flexible/mmu/mobject.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mpagearray.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mpagearray.h
kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mpager.h
kernel/eka/memmodel/epoc/flexible/mmu/mptalloc.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mptalloc.h
kernel/eka/memmodel/epoc/flexible/mmu/mrom.cpp
kernel/eka/memmodel/epoc/flexible/mmu/mswap.h
kernel/eka/memmodel/epoc/mmubase/defragbase.cpp
kernel/eka/memmodel/epoc/mmubase/mmubase.cpp
kernel/eka/memmodel/epoc/mmubase/ramalloc.cpp
kernel/eka/nkern/arm/nklib.cia
kernel/eka/nkern/nkern.mmp
kernel/eka/nkern/nklib.cpp
kernel/eka/nkernsmp/arm/nccpu.cpp
kernel/eka/nkernsmp/arm/ncglob.cpp
kernel/eka/nkernsmp/arm/ncmonitor.cpp
kernel/eka/nkernsmp/arm/ncsched.cia
kernel/eka/nkernsmp/arm/ncsched.cpp
kernel/eka/nkernsmp/arm/ncthrd.cpp
kernel/eka/nkernsmp/arm/ncutilf.cia
kernel/eka/nkernsmp/arm/ncutils.cpp
kernel/eka/nkernsmp/nk_bal.cpp
kernel/eka/nkernsmp/nkern.cpp
kernel/eka/nkernsmp/nkern.mmp
kernel/eka/nkernsmp/nkerns.cpp
kernel/eka/nkernsmp/sched.cpp
kernel/eka/nkernsmp/x86/ncglob.cpp
kernel/eka/nkernsmp/x86/ncmonitor.cpp
kernel/eka/nkernsmp/x86/ncsched.cpp
kernel/eka/nkernsmp/x86/ncutilf.cpp
kernel/eka/nkernsmp/x86/ncutils.cpp
kernel/eka/release.txt
kernel/eka/rombuild/kernel.hby
kerneltest/e32test/benchmark/thread.cpp
kerneltest/e32test/defrag/t_ramdefrag.cpp
kerneltest/e32test/demandpaging/t_thrash.cpp
kerneltest/e32test/group/bld.inf
kerneltest/e32test/group/d_frqchg.mmh
kerneltest/e32test/group/t_cachechunk.mmp
kerneltest/e32test/group/t_frqchg.mmp
kerneltest/e32test/group/t_ramall.mmp
kerneltest/e32test/group/t_semutx.mmp
kerneltest/e32test/misc/t_cputime.cpp
kerneltest/e32test/mmu/t_cachechunk.cpp
kerneltest/e32test/mmu/t_demandpaging.cpp
kerneltest/e32test/mmu/t_ramall.cpp
kerneltest/e32test/mmu/t_shbuf.cpp
kerneltest/e32test/power/d_frqchg.cpp
kerneltest/e32test/power/d_frqchg.h
kerneltest/e32test/power/t_frqchg.cpp
kerneltest/e32test/prime/t_semutx.cpp
kerneltest/e32utils/analyse/profiler.rtf
kerneltest/e32utils/group/base_e32utils.mrp
kerneltest/e32utils/group/bld.inf
kerneltest/f32test/ext/t_bitproxydrive.cpp
kerneltest/f32test/group/bld.inf
kerneltest/f32test/group/t_bitproxydrive.mmp
kerneltest/f32test/group/t_dircache.mmp
kerneltest/f32test/group/t_proxydrive1.mmp
kerneltest/f32test/server/t_dircache.cpp
kerneltest/f32test/server/t_filecache.cpp
kerneltest/f32test/server/t_proxydrive1.cpp
userlibandfileserver/fileserver/etshell/ts_com.cpp
userlibandfileserver/fileserver/etshell/ts_std.h
userlibandfileserver/fileserver/group/release.txt
userlibandfileserver/fileserver/inc/f32dbg.h
userlibandfileserver/fileserver/inc/f32fsys.h
userlibandfileserver/fileserver/inc/f32ver.h
userlibandfileserver/fileserver/sfat32/inc/sl_std.inl
userlibandfileserver/fileserver/sfat32/sl_dir_cache.cpp
userlibandfileserver/fileserver/sfat32/sl_dir_cache.h
userlibandfileserver/fileserver/sfat32/sl_dir_cache.inl
userlibandfileserver/fileserver/sfat32/sl_drv.cpp
userlibandfileserver/fileserver/sfat32/sl_file.cpp
userlibandfileserver/fileserver/sfat32/sl_leafdir_cache.cpp
userlibandfileserver/fileserver/sfat32/sl_mnt.cpp
userlibandfileserver/fileserver/sfile/sf_cache_client.cpp
userlibandfileserver/fileserver/sfile/sf_cache_client.h
userlibandfileserver/fileserver/sfile/sf_cache_man.cpp
userlibandfileserver/fileserver/sfile/sf_debug.cpp
userlibandfileserver/fileserver/sfile/sf_drv.cpp
userlibandfileserver/fileserver/sfile/sf_ext.cpp
userlibandfileserver/fileserver/sfile/sf_file.cpp
userlibandfileserver/fileserver/sfile/sf_file_cache.cpp
userlibandfileserver/fileserver/sfile/sf_file_cache.h
userlibandfileserver/fileserver/sfile/sf_local.cpp
userlibandfileserver/fileserver/sfile/sf_memory_client.cpp
userlibandfileserver/fileserver/sfile/sf_memory_man.cpp
userlibandfileserver/fileserver/sfile/sf_memory_man.h
userlibandfileserver/fileserver/sfile/sf_nbs.cpp
userlibandfileserver/fileserver/sfile/sf_prel.cpp
userlibandfileserver/fileserver/sfile/sf_std.h
userlibandfileserver/fileserver/sfile/sf_thread.cpp
userlibandfileserver/fileserver/sfsrv/cl_scan.cpp
userlibandfileserver/fileserver/shostmassstorage/server/controller/cusbhostmsdevicethread.cpp
userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp
userlibandfileserver/fileserver/shostmassstorage/server/src/include/cusbhostmssession.h
--- a/kernel/eka/bmarm/euseru.def	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/bmarm/euseru.def	Tue Jul 06 15:50:07 2010 +0300
@@ -2268,4 +2268,9 @@
 	__DbgGetAllocFail__10RAllocator @ 2267 NONAME R3UNUSED ; RAllocator::__DbgGetAllocFail(void)
 	__DbgGetAllocFail__4Useri @ 2268 NONAME R3UNUSED ; User::__DbgGetAllocFail(int)
 	SetKeyOffset__10RArrayBasei @ 2269  NONAME R3UNUSED ; RArrayBase::SetKeyOffset(int)
+	Poll__10RSemaphore @ 2270 NONAME R3UNUSED ; RSemaphore::Poll(void)
+	Wait__6RMutexi @ 2271 NONAME R3UNUSED ; RMutex::Wait(int)
+	Poll__6RMutex @ 2272 NONAME R3UNUSED ; RMutex::Poll(void)
+	Poll__9RFastLock @ 2273 NONAME R3UNUSED ; RFastLock::Poll(void)
+	Wait__9RFastLocki @ 2274 NONAME R3UNUSED ; RFastLock::Wait(int)
 	
--- a/kernel/eka/bwins/euseru.def	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/bwins/euseru.def	Tue Jul 06 15:50:07 2010 +0300
@@ -2216,4 +2216,8 @@
 	?__DbgGetAllocFail@RAllocator@@QAE?AW4TAllocFail@1@XZ @ 2215 NONAME ; enum RAllocator::TAllocFail RAllocator::__DbgGetAllocFail(void)
 	?__DbgGetAllocFail@User@@SA?AW4TAllocFail@RAllocator@@H@Z @ 2216 NONAME ; enum RAllocator::TAllocFail User::__DbgGetAllocFail(int)
 	?SetKeyOffset@RArrayBase@@IAEXH@Z @ 2217  NONAME ; void RArrayBase::SetKeyOffset(int)
-
+	?Poll@RFastLock@@QAEHXZ @ 2218 NONAME ; public: int __thiscall RFastLock::Poll(void)
+	?Poll@RMutex@@QAEHXZ @ 2219 NONAME ; public: int __thiscall RMutex::Poll(void)
+	?Poll@RSemaphore@@QAEHXZ @ 2220 NONAME ; public: int __thiscall RSemaphore::Poll(void)
+	?Wait@RMutex@@QAEHH@Z @ 2221 NONAME ; public: int __thiscall RMutex::Wait(int)
+	?Wait@RFastLock@@QAEHH@Z @ 2222 NONAME ; public: int __thiscall RFastLock::Wait(int)
--- a/kernel/eka/bx86/euseru.def	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/bx86/euseru.def	Tue Jul 06 15:50:07 2010 +0300
@@ -2216,4 +2216,8 @@
 	?__DbgGetAllocFail@RAllocator@@QAE?AW4TAllocFail@1@XZ @ 2215 NONAME ; enum RAllocator::TAllocFail RAllocator::__DbgGetAllocFail(void)
 	?__DbgGetAllocFail@User@@SA?AW4TAllocFail@RAllocator@@H@Z @ 2216 NONAME ; enum RAllocator::TAllocFail User::__DbgGetAllocFail(int)
 	?SetKeyOffset@RArrayBase@@IAEXH@Z @ 2217  NONAME ; void RArrayBase::SetKeyOffset(int)
-	
+	?Poll@RFastLock@@QAEHXZ @ 2218 NONAME ; public: int __thiscall RFastLock::Poll(void)
+	?Poll@RMutex@@QAEHXZ @ 2219 NONAME ; public: int __thiscall RMutex::Poll(void)
+	?Poll@RSemaphore@@QAEHXZ @ 2220 NONAME ; public: int __thiscall RSemaphore::Poll(void)
+	?Wait@RMutex@@QAEHH@Z @ 2221 NONAME ; public: int __thiscall RMutex::Wait(int)
+	?Wait@RFastLock@@QAEHH@Z @ 2222 NONAME ; public: int __thiscall RFastLock::Wait(int)
--- a/kernel/eka/bx86gcc/euseru.def	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/bx86gcc/euseru.def	Tue Jul 06 15:50:07 2010 +0300
@@ -2495,4 +2495,8 @@
 	_ZN10RAllocator17__DbgGetAllocFailEv @ 2494 NONAME
 	_ZN4User17__DbgGetAllocFailEi @ 2495 NONAME
 	_ZN10RArrayBase12SetKeyOffsetEi @ 2496 NONAME
-
+	_ZN10RSemaphore4PollEv @ 2497 NONAME ; RSemaphore::Poll()
+	_ZN6RMutex4WaitEi @ 2498 NONAME ; RMutex::Wait(int)
+	_ZN6RMutex4PollEv @ 2499 NONAME ; RMutex::Poll()
+	_ZN9RFastLock4PollEv @ 2500 NONAME ; RFastLock::Poll()
+	_ZN9RFastLock4WaitEi @ 2501 NONAME ; RFastLock::Wait(int)
--- a/kernel/eka/drivers/bsp/bld.inf	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/drivers/bsp/bld.inf	Tue Jul 06 15:50:07 2010 +0300
@@ -51,13 +51,9 @@
 ../resmanus/resmanus
 ../resmanus/resmanusextended
 
+#if !defined(WINS)
 ../power/smppower/idlehelper_lib.mmp
 ../power/smppower/sample_idlehandler/smpidlehandler_lib.mmp
-
-#endif
-
-#if !defined(X86)
-#if !defined(WINS)
 ../iic/iic
 #endif
 #endif
--- a/kernel/eka/drivers/locmedia/dmasupport.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/drivers/locmedia/dmasupport.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -743,43 +743,79 @@
 	{
 	OstTraceFunctionEntry0( DDMAHELPER_GETPHYSICALADDRESS_ENTRY );
 	__ASSERT_DEBUG( (aReq.Flags() & TLocDrvRequest::ETClientBuffer) == 0,  PHYSADDR_FAULT());
-	TLinAddr linAddr = (TLinAddr) aReq.RemoteDes();
-	TInt& offset = aReq.RemoteDesOffset();
-	TLinAddr currLinAddr = linAddr + offset;
-	TInt reqLen = I64LOW(aReq.Length());
-	__ASSERT_DEBUG(I64HIGH(aReq.Length()) == 0,  PHYSADDR_FAULT());
-
-	aAddr = Epoc::LinearToPhysical(currLinAddr);
 
-	// Set the initial length to be the length remaining in this page or the request length (whichever is shorter).
-	// If there are subsequent pages, we then need to determine whether they are contiguous
-	aLen = Min( (TInt) (PageAlign(currLinAddr+iPageSize) - currLinAddr), reqLen - offset);
+	TInt reqLen = I64LOW(aReq.Length());
+    __ASSERT_DEBUG(I64HIGH(aReq.Length()) == 0,  PHYSADDR_FAULT());
+    
+    TInt& offset = aReq.RemoteDesOffset();    
+	if (aReq.Flags() & TLocDrvRequest::EPhysAddrOnly)
+        {        
+        __KTRACE_DMA(Kern::Printf("-Physical Address Only"));
+        __ASSERT_DEBUG(IsPageAligned((TLinAddr)reqLen), PHYSADDR_FAULT());
+        
+        TPhysAddr* physArray = (TPhysAddr*)aReq.RemoteDes();        
+        
+        // Adjust start to the next element to be issued                 
+        TUint pageNo = offset>>iPageSizeLog2;
+        TPhysAddr currPhysPageAddr = aAddr = physArray[pageNo];
+        __ASSERT_DEBUG(IsPageAligned((TLinAddr)currPhysPageAddr), PHYSADDR_FAULT());
+        offset+=iPageSize; 
+        aLen=iPageSize;
 
-	__ASSERT_DEBUG(aLen > 0,  PHYSADDR_FAULT());
-	
-	TPhysAddr currPhysPageAddr = PageAlign((TLinAddr) aAddr);
-
-	offset+= aLen;
-
+        //Determine how many pages are contiguous
+        TPhysAddr nextPhysPageAddr;        
+        while (offset < reqLen)
+            {
+            pageNo++;
+            nextPhysPageAddr = physArray[pageNo];            
+            __ASSERT_DEBUG(PageOffset((TLinAddr) nextPhysPageAddr) == 0,  PHYSADDR_FAULT());
 
-	while (offset < reqLen)
-		{
-		TPhysAddr nextPhysPageAddr = Epoc::LinearToPhysical(linAddr + offset);
-		__ASSERT_DEBUG(PageOffset((TLinAddr) nextPhysPageAddr) == 0,  PHYSADDR_FAULT());
+            if (nextPhysPageAddr != currPhysPageAddr + iPageSize)
+                break;
+            
+            currPhysPageAddr = nextPhysPageAddr;            
+            offset+= iPageSize;
+            aLen+= iPageSize;
+            }
+        
+        __KTRACE_DMA(Kern::Printf(">PHYSADDR:DP:GetPhysS(PhysAddrOnly), physAddr %08X, len %x reqLen %x", aAddr, aLen, reqLen));
+        }
+	else
+	    {	
+        TLinAddr linAddr = (TLinAddr) aReq.RemoteDes();
+        TLinAddr currLinAddr = linAddr + offset;	
+    
+        aAddr = Epoc::LinearToPhysical(currLinAddr);
+    
+        // Set the initial length to be the length remaining in this page or the request length (whichever is shorter).
+        // If there are subsequent pages, we then need to determine whether they are contiguous
+        aLen = Min( (TInt) (PageAlign(currLinAddr+iPageSize) - currLinAddr), reqLen - offset);
+    
+        __ASSERT_DEBUG(aLen > 0,  PHYSADDR_FAULT());
+        
+        TPhysAddr currPhysPageAddr = PageAlign((TLinAddr) aAddr);
+    
+        offset+= aLen;
+    
+        while (offset < reqLen)
+            {
+            TPhysAddr nextPhysPageAddr = Epoc::LinearToPhysical(linAddr + offset);
+            __ASSERT_DEBUG(PageOffset((TLinAddr) nextPhysPageAddr) == 0,  PHYSADDR_FAULT());
+    
+            if (nextPhysPageAddr != currPhysPageAddr + iPageSize)
+                break;
+            
+            currPhysPageAddr = nextPhysPageAddr;
+    
+            TInt len = Min(iPageSize, reqLen - offset);
+            offset+= len;
+            aLen+= len;
+            }
 
-		if (nextPhysPageAddr != currPhysPageAddr + iPageSize)
-			break;
-		
-		currPhysPageAddr = nextPhysPageAddr;
-
-		TInt len = Min(iPageSize, reqLen - offset);
-		offset+= len;
-		aLen+= len;
-		}
-
-
-	__KTRACE_DMA(Kern::Printf(">PHYSADDR:DP:GetPhysS(), linAddr %08X, physAddr %08X, len %x reqLen %x", linAddr + offset, aAddr, aLen, reqLen));
-	OstTraceExt4(TRACE_DEMANDPAGING, DDMAHELPER_GETPHYSICALADDRESS_DP, "linAddr=0x%x; physAddr=0x%x; length=0x%x; reqLen=0x%x", linAddr + offset, aAddr, aLen, reqLen);
+        __KTRACE_DMA(Kern::Printf(">PHYSADDR:DP:GetPhysS(), linAddr %08X, physAddr %08X, len %x reqLen %x", linAddr + offset, aAddr, aLen, reqLen));
+        OstTraceExt4(TRACE_DEMANDPAGING, DDMAHELPER_GETPHYSICALADDRESS_DP, "linAddr=0x%x; physAddr=0x%x; length=0x%x; reqLen=0x%x", linAddr + offset, aAddr, aLen, reqLen);
+	    }
+	
 	OstTraceFunctionExit0( DDMAHELPER_GETPHYSICALADDRESS_EXIT );
 	return KErrNone;
 	}
--- a/kernel/eka/drivers/locmedia/locmedia.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/drivers/locmedia/locmedia.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -78,6 +78,7 @@
 #ifdef __DEMAND_PAGING__
 	DMediaPagingDevice* iPagingDevice;
 	TInt iPageSizeMsk;			// Mask of page size (e.g. 4096-1 -> 4095)
+	TInt iPageSizeLog2;        // LOG2 of page size (i.e. 4096 -> 12)
 	TInt iMediaChanges;
 #endif
 
@@ -1529,6 +1530,10 @@
 	RemoteDes()=(TAny*)d.iPtr;
 	RemoteDesOffset()=d.iOffset;
 	DriverFlags()=d.iFlags;
+	
+	// EPhysAddrOnly should not be set for client requests
+	Flags() &= ~TLocDrvRequest::EPhysAddrOnly;
+	
 	if (Pos()<0 || Length()<0)
 	    {
 		OstTraceFunctionExitExt( TLOCDRVREQUEST_PROCESSMESSAGEDATA_EXIT2, this, KErrArgument );
@@ -1828,6 +1833,7 @@
 #ifdef __DEMAND_PAGING__
 	TInt pageSize = Kern::RoundToPageSize(1);
 	iBody->iPageSizeMsk = pageSize-1;
+	iBody->iPageSizeLog2 = __e32_find_ms1_32(pageSize);
 #endif
 
 	iLastMediaId=aLastMediaId;
@@ -4070,19 +4076,23 @@
 	TInt len = I64LOW(m.Length());
 
 	TBool needSyncAfterRead = EFalse;
-	if (m.Drive()->iDmaHelper)
-		{
-		m.Flags() |= TLocDrvRequest::EPhysAddr;
-		if (m.Id() == DLocalDrive::EWrite)
-			{
-			Cache::SyncMemoryBeforeDmaWrite(addr, len);
-			}
-		else
-			{
-			Cache::SyncMemoryBeforeDmaRead(addr, len);
-			needSyncAfterRead = ETrue;
-			}
-		}
+    if (m.Drive()->iDmaHelper)
+        {        
+        m.Flags() |= TLocDrvRequest::EPhysAddr;
+        // don't cache sync for zero mapping...
+        if (!(m.Flags() & TLocDrvRequest::EPhysAddrOnly))
+            {
+            if (m.Id() == DLocalDrive::EWrite)
+                {
+                Cache::SyncMemoryBeforeDmaWrite(addr, len);
+                }
+            else
+                {
+                Cache::SyncMemoryBeforeDmaRead(addr, len);
+                needSyncAfterRead = ETrue;
+                }
+            }
+	    }
 
 	// Count the number of outstanding requests if this is the data-paging media, so that
 	// we can call DPagingDevice::NotifyBusy() / DPagingDevice::NotifyIdle()
@@ -4139,6 +4149,17 @@
 	}
 
 TInt DMediaPagingDevice::Read(TThreadMessage* aReq,TLinAddr aBuffer,TUint aOffset,TUint aSize,TInt aDrvNumber)
+    {
+    return BaseRead(aReq,(TUint32)aBuffer,aOffset,aSize,aDrvNumber,EFalse);
+    }
+
+TInt DMediaPagingDevice::ReadPhysical(TThreadMessage* aReq, TPhysAddr* aPageArray, TUint aPageCount, TUint aOffset, TInt aDrvNumber)
+    {    
+    TUint adjSize = (aPageCount << iPrimaryMedia->iBody->iPageSizeLog2) >> iReadUnitShift; // translate to Read Units
+    return BaseRead(aReq,(TUint32)aPageArray,aOffset,adjSize,aDrvNumber,ETrue);
+    }
+
+TInt DMediaPagingDevice::BaseRead(TThreadMessage* aReq,TUint32 aBuffer,TUint aOffset,TUint aSize,TInt aDrvNumber, TBool aPhysAddr)
 	{
 	OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_READ_ENTRY, this );
 	__ASSERT_ALWAYS(NKern::CurrentThread()!=iPrimaryMedia->iDfcQ->iThread,LOCM_FAULT());	// that would lock up the system, thus better die now
@@ -4287,7 +4308,10 @@
 		m.Length()=Int64(size);
 		m.RemoteDes()=(TAny*)aBuffer;
 		m.RemoteDesOffset()=0;		// pre-aligned
-		m.DriverFlags()=0;
+		m.DriverFlags() = 0;
+		if (aPhysAddr)
+		    m.Flags() |= TLocDrvRequest::EPhysAddrOnly;
+
 		__KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("ReqId=%d, Pos=0x%lx, Len=0x%lx, remote Des 0x%x",m.Id(),m.Pos(),m.Length(),m.RemoteDes()));
 		OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_READ2, "reqId=%d; remote Des=0x%x", (TInt) m.Id(), (TUint) m.RemoteDes());
 		OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_READ3, "length=%x:%x, pos=%x:%x", (TUint) I64HIGH(m.Length()), (TUint) I64LOW(m.Length()), (TUint) I64HIGH(m.Pos()), (TUint) I64LOW(m.Pos()));
@@ -4336,7 +4360,18 @@
 	}
 
 TInt DMediaPagingDevice::Write(TThreadMessage* aReq,TLinAddr aBuffer,TUint aOffset,TUint aSize,TBool aBackground)
-	{
+    {
+    return BaseWrite(aReq,(TUint32)aBuffer,aOffset,aSize,aBackground,EFalse);
+    }
+
+TInt DMediaPagingDevice::WritePhysical(TThreadMessage* aReq, TPhysAddr* aPageArray, TUint aPageCount, TUint aOffset, TBool aBackground)
+	{
+    TUint adjSize = (aPageCount << iPrimaryMedia->iBody->iPageSizeLog2) >> iReadUnitShift; // translate to Read Units
+    return BaseWrite(aReq,(TUint32)aPageArray,aOffset,adjSize,aBackground,ETrue);
+	}
+
+TInt DMediaPagingDevice::BaseWrite(TThreadMessage* aReq,TUint32 aBuffer,TUint aOffset,TUint aSize,TBool aBackground, TBool aPhysAddr)
+    {
 	OstTraceFunctionEntry1( DMEDIAPAGINGDEVICE_WRITE_ENTRY, this );
 	__ASSERT_ALWAYS(NKern::CurrentThread()!=iPrimaryMedia->iDfcQ->iThread,LOCM_FAULT());	// that would lock up the system, thus better die now
 	__ASSERT_ALWAYS(aReq,LOCM_FAULT());
@@ -4396,7 +4431,11 @@
 	TInt retVal = KErrGeneral;
 	for (TInt i=0; retVal != KErrNone && i < KPageOutRetries; i++)
 		{
-		m.Flags() = TLocDrvRequest::EKernelBuffer | TLocDrvRequest::EPaging | TLocDrvRequest::EDataPaging | (aBackground ? TLocDrvRequest::EBackgroundPaging : 0);
+		m.Flags() = TLocDrvRequest::EKernelBuffer |
+					TLocDrvRequest::EPaging | 
+                    TLocDrvRequest::EDataPaging | 
+                    (aBackground ? TLocDrvRequest::EBackgroundPaging : 0) |
+                    (aPhysAddr ? TLocDrvRequest::EPhysAddrOnly : 0);
 
 		m.Id() = DLocalDrive::EWrite;
 		m.Drive() = TheDrives[iDataPagingDriveNumber];
@@ -4406,7 +4445,8 @@
 		m.Length()=Int64(size);
 		m.RemoteDes()=(TAny*)aBuffer;
 		m.RemoteDesOffset()=0;		// pre-aligned
-		m.DriverFlags()=0;
+		m.DriverFlags() = 0;        
+
 		__KTRACE_OPT2(KLOCDRV,KLOCDPAGING,Kern::Printf("ReqId=%d, Pos=0x%lx, Len=0x%lx, remote Des 0x%x",m.Id(),m.Pos(),m.Length(),m.RemoteDes()));
 		OstTraceDefExt2(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_WRITE2, "reqId=%d; remote Des=0x%x", (TInt) m.Id(), (TUint) m.RemoteDes());
 		OstTraceDefExt4(OST_TRACE_CATEGORY_RND, TRACE_DEMANDPAGING, DMEDIAPAGINGDEVICE_WRITE3, "length=%x:%x, pos=%x:%x", (TUint) I64HIGH(m.Length()), (TUint) I64LOW(m.Length()),  (TUint) I64HIGH(m.Pos()), (TUint) I64LOW(m.Pos()));
@@ -5267,6 +5307,8 @@
 
 	TInt dataPagingDriveNumber = KErrNotFound;
 	TInt swapSize = 0;
+	TInt blockSize = 0;
+	TUint16 flags = 0;
 
 	// find the local drive assocated with the primary media
 	for (i=0; i<KMaxLocalDrives; ++i)
@@ -5301,9 +5343,10 @@
 
 
 		TLocDrvRequest m;
+        TBuf8<KMaxLocalDriveCapsLength> capsBuf;
+        
 		memclr(&m, sizeof(m));
 		
-
 		// Get the Caps from the device. NB for MMC/SD we may need to retry as some PSLs start up
 		// in "door open" or "media not present" state which can result in the cancellation of requests
 		TInt i;
@@ -5311,7 +5354,6 @@
 		TInt r = KErrNotReady;
 		for (i=0; r == KErrNotReady && i < KRetries; i++)
 			{
-			TBuf8<KMaxLocalDriveCapsLength> capsBuf;
 			capsBuf.SetMax();
 			capsBuf.FillZ();
 			m.Drive() = TheDrives[firstLocalDriveNumber];
@@ -5333,6 +5375,11 @@
 			return KErrNotSupported;
 		    }
 
+		TLocalDriveCapsV6& caps = *(TLocalDriveCapsV6*)capsBuf.Ptr();
+		blockSize = caps.iBlockSize;
+		__ASSERT_DEBUG(blockSize,LOCM_FAULT());
+		__ASSERT_DEBUG(__e32_bit_count_32(blockSize)==1,LOCM_FAULT());
+		
 		TLocDrv* drive;
 		for (i=0; i<KMaxLocalDrives; ++i)
 			{
@@ -5359,6 +5406,10 @@
 					dataPagingDriveNumber = i;
 					TheDataPagingDrive = drive;
 					swapSize = drive->iPartitionLen >> aReadShift;
+					
+			        // Mark Paging Device capable of utilising physical addresss only accesses
+			        if (drive->iDmaHelper)
+			            flags |= DPagingDevice::ESupportsPhysicalAccess;  
 					}
 				}
 			}
@@ -5393,16 +5444,20 @@
 
 	pagingDevice->iDataPagingDriveNumber = dataPagingDriveNumber;
 	pagingDevice->iSwapSize = swapSize;
+		
+	pagingDevice->iPreferredWriteShift = (blockSize) ? __e32_find_ms1_32(blockSize) : 0;
 
 #ifdef __DEBUG_DEMAND_PAGING__
 	Kern::Printf("PagingDevice :");
 	Kern::Printf("Name %S", firstLocalDriveNumber >= 0 && DriveNames[firstLocalDriveNumber] ? DriveNames[firstLocalDriveNumber] : &KNullDesC8);
 	Kern::Printf("iType 0x%x", pagingDevice->iType);
+	Kern::Printf("iFlags 0x%x\n", pagingDevice->iFlags);
 	Kern::Printf("iReadUnitShift 0x%x", pagingDevice->iReadUnitShift);
 	Kern::Printf("iFirstLocalDriveNumber 0x%x", pagingDevice->iFirstLocalDriveNumber);
 	Kern::Printf("iRomPagingDriveNumber 0x%x", pagingDevice->iRomPagingDriveNumber);
 	Kern::Printf("iDataPagingDriveNumber 0x%x", pagingDevice->iDataPagingDriveNumber);
 	Kern::Printf("iSwapSize 0x%x", pagingDevice->iSwapSize);
+	Kern::Printf("iPreferredWriteShift 0x%x\n", pagingDevice->iPreferredWriteShift);
 #endif
 
 
--- a/kernel/eka/drivers/pbus/mmc/mmccd_init.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/drivers/pbus/mmc/mmccd_init.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -278,6 +278,16 @@
 			break;
 
 #if !defined(__WINS__)
+        if ((mi.iFlags & TMMCMachineInfo::ESupportsDMA) == TMMCMachineInfo::ESupportsDMA)
+            {
+            err = LocDrv::RegisterDmaDevice(pMedia,
+                                            KMMCardHighCapBlockSize, 
+                                            pS->MaxDataTransferLength(), 
+                                            pS->DmaAlignment());
+            if (err != KErrNone)
+                break;
+            }		
+		
 		if (demandPagingSupported && demandPagingInfo.iSlotNumber == i)
 			{
 			err = LocDrv::RegisterPagingDevice(
@@ -295,16 +305,6 @@
 			if (err != KErrNone)
 				break;
 			}
-
-		if ((mi.iFlags & TMMCMachineInfo::ESupportsDMA) == TMMCMachineInfo::ESupportsDMA)
-			{
-			err = LocDrv::RegisterDmaDevice(pMedia,
-											KMMCardHighCapBlockSize, 
-											pS->MaxDataTransferLength(), 
-											pS->DmaAlignment());
-			if (err != KErrNone)
-				break;
-			}
 #endif // __WINS__
 
 		driveListIndex+= drivesPerSlot;
--- a/kernel/eka/drivers/power/smppower/idlehelper.cia	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/drivers/power/smppower/idlehelper.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -85,12 +85,12 @@
 	LDREX(3,1);                                                       // r3 = iIdlingCpus
     asm("orr    r3,r0,r3");                                           // orr in mask for this CPU
     asm("cmp    r3,r2");                                              // compare to iAllEngagedCpusMask
-    asm("orreq  r3,r3,#%a0" : : "i" ((TUint32)TIdleSupport::KGlobalIdleFlag)); // if equal orr in KGlobalIdleFlag
+    asm("orreq  r3,r3,#%a0" : : "i" ((TInt)TIdleSupport::KGlobalIdleFlag)); // if equal orr in KGlobalIdleFlag
     STREX(12,3,1);
     asm("cmp    r12, #0 ");                                              // 
 	asm("bne    1b ");                                                   // write didn't succeed try again
     __DATA_MEMORY_BARRIER__(r12);
-    asm("and    r0,r3,#%a0" : : "i" ((TUint32)TIdleSupport::KGlobalIdleFlag));
+    asm("and    r0,r3,#%a0" : : "i" ((TInt)TIdleSupport::KGlobalIdleFlag));
 	__JUMP(,lr);
     asm("__iAllEngagedCpusMask:");
     asm(".word %a0" : : "i" ((TInt)&TIdleSupport::iAllEngagedCpusMask));//
@@ -149,7 +149,7 @@
 #endif		
     asm("2: ");
     asm("cmp r3,r5");                       // all (old stage does not equal new stage)
-    asm("bne 3f");                            // yup return
+    asm("ldmnefd sp!, {r4-r5,pc}");         // yup return
 #ifdef SYNCPOINT_WFE		
 	__DATA_MEMORY_BARRIER__(r12);        
 	ARM_WFE;
@@ -158,8 +158,6 @@
     __DATA_MEMORY_BARRIER__(r12);           // ensure read is observed
     asm("mov r3,r2,lsr #16");               // re-read new stage
     asm("b 2b");                            // loop back
-    asm("3: ");
-    asm("ldmfd sp!, {r4-r5,pc}");         // return
     }
 
 /** 
@@ -210,7 +208,7 @@
 #endif		
     asm("2: ");
     asm("ands r3,r2,#0x80000000");          // MSB set?	
-    asm("bne 4f");                          // yup return
+    asm("ldmnefd sp!, {r4,pc}");            // yup return
 #ifdef SYNCPOINT_WFE		
 	__DATA_MEMORY_BARRIER__(r12);
 	ARM_WFE;
@@ -224,8 +222,7 @@
     __DATA_MEMORY_BARRIER__(r12);           // ensure that's written
 	ARM_SEV;
 #endif	
-    asm("4:");
-    asm("ldmfd sp!, {r4,pc}");            // return
+    asm("ldmfd sp!, {r4,pc}");            // yup return
     }
 	
 	
@@ -295,7 +292,7 @@
     }
 #endif
 
-__NAKED__  TUint32 TIdleSupport::IntPending()  
+__NAKED__  TInt TIdleSupport::IntPending()  
     {
 	asm("ldr    r1,__KCPUIFAddr");//r1 = address of iBaseIntIfAddress
 	asm("ldr	r1, [r1]");//r1 = address of Hw GIC CPU interrupt interface base address
--- a/kernel/eka/drivers/power/smppower/idlehelper.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/drivers/power/smppower/idlehelper.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -70,7 +70,7 @@
 
 TBool TIdleSupport::IsIntPending()
 	{
-	return (IntPending()!=KNoInterruptsPending);
+	return ((TUint32)IntPending()!=KNoInterruptsPending);
 	}
 		
 /**
@@ -190,7 +190,8 @@
 /**
    mark a core as retired
 
-   @pre called by idle handler
+   @pre called by idle handler as part of idle entry before 
+          any syncpoint or calls to SetLocalAndCheckSetGlobalIdle
 */	
 void TIdleSupport::MarkCoreRetired(TUint32 aCpuMask)
     {
@@ -200,7 +201,8 @@
 
 /**
    mark a core as enaged
-   @pre called outside idle handler
+   @pre called outside idle handler ( can be called in idle entry before 
+        any syncpoint or calls to SetLocalAndCheckSetGlobalIdle
  */	
 void TIdleSupport::MarkCoreEngaged(TUint32 aCpuMask)
     {
--- a/kernel/eka/eabi/euseru.def	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/eabi/euseru.def	Tue Jul 06 15:50:07 2010 +0300
@@ -2538,4 +2538,8 @@
 	_ZN10RAllocator17__DbgGetAllocFailEv @ 2537 NONAME
 	_ZN4User17__DbgGetAllocFailEi @ 2538 NONAME
 	_ZN10RArrayBase12SetKeyOffsetEi @ 2539 NONAME
-
+	_ZN10RSemaphore4PollEv @ 2540 NONAME ; RSemaphore::Poll()
+	_ZN6RMutex4WaitEi @ 2541 NONAME ; RMutex::Wait(int)
+	_ZN6RMutex4PollEv @ 2542 NONAME ; RMutex::Poll()
+	_ZN9RFastLock4PollEv @ 2543 NONAME ; RFastLock::Poll()
+	_ZN9RFastLock4WaitEi @ 2544 NONAME ; RFastLock::Wait(int)
--- a/kernel/eka/euser/epoc/arm/uc_utl.cia	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/euser/epoc/arm/uc_utl.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -1321,6 +1321,42 @@
 #endif
 	}
 
+EXPORT_C __NAKED__ TInt RFastLock::Poll()
+	{
+	asm("1: ");
+	asm("add	r0, r0, #4 ");					// point to iCount
+
+#ifdef __CPU_ARM_HAS_LDREX_STREX
+	asm("2:		");
+	LDREX(		2, 0);							// read
+	asm("subs	r1, r2, #1 ");					// decrement
+	asm("bcs	3f ");							// if no borrow, lock cannot be obtained so bail out
+	STREX(		3, 1, 0);						// write
+	asm("teq	r3, #0 ");						// success?
+	asm("bne	2b ");							// no!
+	asm("mov	r0, #0 ");						// lock acquired so return KErrNone
+#ifdef __SMP__
+	__DATA_MEMORY_BARRIER__(r3);				// need acquire barrier
+#endif
+	__JUMP(,	lr);
+
+	asm("3:		");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrTimedOut));	// else can't get it immediately so return KErrTimedOut
+	__JUMP(,	lr);
+#else	// no LDREX/STREX - ARM arch 5 CPU
+	asm("mov	r1, #1 ");						// 'looking' value
+	asm("swp	r1, r1, [r0] ");				// write looking value, read original
+	asm("subs	r2, r1, #1 ");					// decrement count
+	asm("strcc	r2, [r0] ");					// if borrow, was originally zero so write back -1 and return KErrNone
+	asm("movcc	r0, #0 ");						// got lock - return KErrNone
+ 	__JUMP(cc,	lr);
+
+	asm("strlt	r1, [r0] ");					// else if result<0 (i.e. wasn't looking value) write back original
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrTimedOut));	// else can't get it immediately so return KErrTimedOut
+ 	__JUMP(,	lr);
+#endif
+	}
+
 EXPORT_C __NAKED__ void RFastLock::Signal()
 	{
 	asm("1: ");
@@ -1356,6 +1392,122 @@
 	}
 
 
+/**
+Acquire the lock, if necessary waiting up to a specified maximum amount of time
+for it to become free.
+
+This function checks if the lock is currently held. If not the lock is marked
+as held by the current thread and the call returns immediately. If the lock is
+held by another thread the current thread will suspend until the lock becomes
+free or until the specified timeout period has elapsed.
+
+@param aTimeout The timeout value in microseconds
+
+@return KErrNone if the lock was acquired successfully.
+        KErrTimedOut if the timeout has expired.
+        KErrGeneral if the lock is being reset, i.e the lock
+        is about to  be deleted.
+        KErrArgument if aTimeout is negative;
+        otherwise one of the other system wide error codes.
+*/
+EXPORT_C __NAKED__ TInt RFastLock::Wait(TInt /*aTimeout*/)
+	{
+	asm("stmfd	sp!, {r4-r6,lr} ");
+	asm("add	r4, r0, #4 ");					// r4->iCount
+	asm("subs	r5, r1, #0 ");					// r5=aTimeout
+	asm("mov	r6, #1000 ");
+	asm("movle	r0, #%a0" : : "i" ((TInt)KErrArgument));	
+	__CPOPRET(le, "r4-r6,");					// if aTimeout<=0 return KErrArgument
+	asm("1:		");
+
+#ifdef __CPU_ARM_HAS_LDREX_STREX
+	asm("2:		");
+	LDREX(		2, 4);							// read
+	asm("subs	r12, r2, #1 ");					// decrement
+	STREX(		3, 12, 4);						// write
+	asm("teq	r3, #0 ");						// success?
+	asm("bne	2b ");							// no!
+	asm("bcs	8f ");							// if no borrow from decrement, need to wait
+#ifdef __SMP__
+	__DATA_MEMORY_BARRIER__(r3);				// no need to wait, but still need acquire barrier
+#endif
+#else	// no LDREX/STREX - ARM arch 5 CPU
+	asm("mov	r2, #1 ");						// 'looking' value
+	asm("swp	r2, r2, [r4] ");				// write looking value, read original
+	asm("subs	r12, r2, #1 ");					// decrement count
+	asm("strlt	r12, [r4] ");					// if it becomes negative, no-one was looking
+	asm("bcs	8f ");							// if no borrow, we have to wait
+#endif
+	asm("mov	r0, #0 ");						// return KErrNone
+	__POPRET("r4-r6,");
+
+// We need to wait
+	asm("8:		");
+#ifndef __CPU_ARM_HAS_LDREX_STREX
+// no LDREX/STREX - ARM arch 5 CPU
+	asm("blt	3f ");							// if it wasn't 'looking' value, branch
+
+	// it was the 'looking' value, so wait a little bit
+	asm("cmp	r5, #0 ");
+	asm("ble	9f ");							// waited too long already, return KErrTimedOut
+	asm("sub	r5, r5, r6 ");
+	asm("mov	r6, #2000 ");
+	asm("mov	r0, #1000 ");					// wait 1ms
+	asm("cmp	r5, r0 ");
+	asm("movlt	r5, r0 ");						// remaining time at least 1ms
+	asm("bl "	CSM_ZN4User12AfterHighResE27TTimeIntervalMicroSeconds32);
+	asm("b		1b ");							// try again
+#endif
+	asm("3:		");
+	asm("sub	r0, r4, #4 ");					// r0=this
+	asm("mov	r1, r5 ");						// r1=aTimeout
+	asm("bl "	CSM_ZN10RSemaphore4WaitEi);	// try to acquire semaphore
+	asm("cmp	r0, #%a0" : : "i" ((TInt)KErrTimedOut));
+	__CPOPRET(ne, "r4-r6,");					// if wait didn't time out, return
+	asm("mov	r5, #1 ");						// any further timed waits will be for minimum period
+	
+	// Before we can return KErrTimedOut we must increment iCount (since we
+	// previously decremented it in anticipation of acquiring the lock.
+	// However we must not increment iCount if it would become zero, since
+	// the semaphore will have been signalled (to counterbalance the Wait()
+	// which timed out and thus never happened). This would result in two
+	// threads being able to acquire the lock simultaneously - one by
+	// decrementing iCount from 0 to -1 without looking at the semaphore,
+	// and the other by decrementing iCount from -1 to -2 and then absorbing
+	// the spurious semaphore signal.
+	//	orig = __e32_atomic_tas_ord32(&iCount, -1, 0, 1);	// don't release lock completely
+	//	if (orig < -1)
+	//		return KErrTimedOut;	// count corrected - don't need to touch semaphore
+	// lock is actually free at this point, try again to claim it
+	//	aTimeout = 1;
+#ifdef __CPU_ARM_HAS_LDREX_STREX
+#ifdef __SMP__
+	__DATA_MEMORY_BARRIER_Z__(r3);
+#endif
+	asm("4:		");
+	LDREX(		2, 4);							// read
+	asm("adds	r2, r2, #1 ");					// increment
+	asm("bge	3b ");							// if increment would make result >=0, wait again
+	STREX(		3, 2, 4);						// write
+	asm("teq	r3, #0 ");						// success?
+	asm("bne	4b ");							// no!
+#ifdef __SMP__
+	__DATA_MEMORY_BARRIER__(r3);
+#endif
+#else	// no LDREX/STREX - ARM arch 5 CPU
+	asm("mov	r2, #1 ");						// 'looking' value
+	asm("swp	r2, r2, [r4] ");				// write looking value, read original
+	asm("adds	r12, r2, #1 ");					// increment count
+	asm("strlt	r12, [r4] ");					// if still negative, count now fixed, so return KErrTimedOut
+	asm("streq	r2, [r4] ");					// else if not 'looking' value, write back original
+	asm("bge	3b ");							// if 'looking' value or -1, wait again
+#endif
+	asm("9:		");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrTimedOut));	// return KErrTimedOut
+	__POPRET("r4-r6,");
+	}
+
+
 // Entry point stub to allow EKA1 binaries to be executed under EKA2
 // Only called when process is first loaded
 
--- a/kernel/eka/euser/epoc/win32/emulator.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/euser/epoc/win32/emulator.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -79,6 +79,51 @@
 	return WideCharToMultiByte(Data.iCodePage,0,aUnicode,-1,aNarrow,aLength,"@",NULL);
 	}
 
+LOCAL_C TInt GetSectionsSize(const IMAGE_NT_HEADERS32* aBase)
+//
+// Iterates through the section headers at the start of an image and determines the minimum amount of the
+// PE file that must be read in in order to examine the sections themselves
+//
+	{
+    // List of sections are are interested in examining
+	const BYTE* sectionNames[] =
+			{
+			KWin32SectionName_Symbian, KWin32SectionName_Import, KWin32SectionName_EpocData, KWin32SectionName_EpocBss,
+			KWin32SectionName_Text, KWin32SectionName_RData, KWin32SectionName_NmdExpData
+			};
+
+	// Get a ptr to the first section header in preparation for examining all the section headers
+	DWORD maxOffset = 0;
+	const IMAGE_NT_HEADERS32* ntHead = aBase;
+	const IMAGE_SECTION_HEADER* imgHead = (const IMAGE_SECTION_HEADER*) ((TUint8*) &ntHead->OptionalHeader + ntHead->FileHeader.SizeOfOptionalHeader);
+	const IMAGE_SECTION_HEADER* end = imgHead + ntHead->FileHeader.NumberOfSections;
+
+	for (; imgHead < end; ++imgHead)
+		{
+		TBool SectionUsed = EFalse;
+
+		// Go through each of the sections that we need to examine and see if the current section is in the list
+		for (TInt index = 0; index < (sizeof(sectionNames) / sizeof(BYTE*)); ++index)
+			{
+			if (memcmp(imgHead->Name, sectionNames[index], IMAGE_SIZEOF_SHORT_NAME)==0)
+				SectionUsed = ETrue;
+			}
+
+		// If the current section is one we are interested in, calculate its offset in the raw file and add its size;
+		// this gives us the minimum amount of the file to be mapped in order to examine this section and all those
+		// preceding it
+		if (SectionUsed)
+			{
+			if ((imgHead->PointerToRawData + imgHead->SizeOfRawData) > maxOffset)
+				{
+				maxOffset = (imgHead->PointerToRawData + imgHead->SizeOfRawData);
+				}
+			}
+		}
+
+	return(maxOffset);
+	}
+
 template <TUint S>
 struct Buf8
 	{
@@ -810,7 +855,32 @@
 		if (!iMapping)
 			return LastError();
 
-		iBase = MapViewOfFile(iMapping, FILE_MAP_READ, 0, 0, 0);
+		// First we need to read in the PE file's image headers, which consist of a 4 byte signature, the file header
+		// containing general information and up to 96 section headers.  Map this amount of the file into memory so
+		// that we can examine it and calculate the minimum size of the sections themselves that need to be mapped into
+		// memory in order to examine the actual sections
+		SIZE_T headersSize = (sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + (96 * sizeof(IMAGE_OPTIONAL_HEADER)));
+		iBase = MapViewOfFile(iMapping, FILE_MAP_READ, 0, 0, headersSize);
+
+		if (iBase)
+			{
+			// Scan through the section headers and determine the minimum amount of the file to be mapped into memory
+			// in order for us to safely examine the sections, and map the file into memory.  We do this rather than
+			// map the entire PE file into memory because with full debug information, DLLs can be anything up to 100 MB!!!
+			TInt sectionsSize = GetSectionsSize(NtHeader());
+
+			// Before remapping the file with its new size, unmap it.  While one would think that it is safe to
+			// increase the size of the file's mapping it is not, and doing so triggers behaviour in Windows that
+			// results in quickly using up all available virtual memory address space!
+			if (UnmapViewOfFile(iBase))
+				{
+				iBase = MapViewOfFile(iMapping, FILE_MAP_READ, 0, 0, sectionsSize);
+				}
+			else
+				{
+				iBase = NULL;
+				}
+			}
 
 		if (!iBase)
 			{
--- a/kernel/eka/euser/epoc/win32/uc_utl.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/euser/epoc/win32/uc_utl.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -114,6 +114,21 @@
 		RSemaphore::Wait();
 	}
 
+EXPORT_C __NAKED__ TInt RFastLock::Poll()
+	{
+	_asm xor eax, eax
+	_asm xor edx, edx
+	_asm dec edx
+
+	/* if ([ecx+4]==0) { [ecx+4]=-1; ZF=1;} else {eax=[ecx+4]; ZF=0;} */
+	_asm lock cmpxchg [ecx+4], edx
+	_asm jz short fastlock_poll_done
+	_asm mov eax, -33
+
+	fastlock_poll_done:
+	_asm ret
+	}
+
 EXPORT_C void RFastLock::Signal()
 	{
 	if (InterlockedIncrement((LPLONG)&iCount) < 0)
--- a/kernel/eka/euser/epoc/x86/uc_utl.cia	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/euser/epoc/x86/uc_utl.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -42,6 +42,22 @@
 	THISCALL_EPILOG0()
 	}
 
+EXPORT_C __NAKED__ TInt RFastLock::Poll()
+	{
+	THISCALL_PROLOG0()
+	asm("xor eax, eax ");
+	asm("xor edx, edx ");
+	asm("dec edx ");
+
+	/* if ([ecx+4]==0) { [ecx+4]=-1; ZF=1;} else {eax=[ecx+4]; ZF=0;} */
+	asm("lock cmpxchg [ecx+4], edx ");
+	asm("jz short fastlock_poll_done ");
+	asm("mov eax, %0": : "i"(KErrTimedOut));
+
+	asm("fastlock_poll_done: ");
+	THISCALL_EPILOG0()
+	}
+
 EXPORT_C __NAKED__ void RFastLock::Signal()
 	{
 	THISCALL_PROLOG0()
--- a/kernel/eka/euser/us_exec.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/euser/us_exec.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -3768,8 +3768,59 @@
 */
 EXPORT_C void RMutex::Wait()
 	{
-
-	Exec::MutexWait(iHandle);
+	Exec::MutexWait(iHandle, 0);
+	}
+
+
+
+
+/**
+Acquire the mutex if it is currently free, but don't wait for it.
+
+This function checks if the mutex is currently held. If not the mutex is marked
+as held by the current thread and the call returns immediately indicating
+success. If the mutex is held by another thread the call returns immediately
+indicating failure. If the mutex is already held by the current thread a count
+is maintained of how many times the thread has acquired the mutex.
+
+@return	KErrNone if the mutex was acquired
+		KErrTimedOut if the mutex could not be acquired
+        KErrGeneral if the semaphore is being reset, i.e the semaphore
+        is about to  be deleted.
+*/
+EXPORT_C TInt RMutex::Poll()
+	{
+	return Exec::MutexWait(iHandle, -1);
+	}
+
+
+
+
+/**
+Acquire the mutex, if necessary waiting up to a specified maximum amount of time
+for it to become free.
+
+This function checks if the mutex is currently held. If not the mutex is marked
+as held by the current thread and the call returns immediately. If the mutex is
+held by another thread the current thread will suspend until the mutex becomes
+free or until the specified timeout period has elapsed. If the mutex is already
+held by the current thread a count is maintained of how many times the thread
+has acquired the mutex.
+
+@param aTimeout The timeout value in microseconds
+
+@return KErrNone if the mutex was acquired successfully.
+        KErrTimedOut if the timeout has expired.
+        KErrGeneral if the mutex is being reset, i.e the mutex
+        is about to  be deleted.
+        KErrArgument if aTimeout is negative;
+        otherwise one of the other system wide error codes.
+*/
+EXPORT_C TInt RMutex::Wait(TInt aTimeout)
+	{
+	if (aTimeout>=0)
+		return Exec::MutexWait(iHandle, aTimeout);
+	return KErrArgument;
 	}
 
 
@@ -4308,7 +4359,6 @@
 
 
 
-EXPORT_C void RSemaphore::Wait()
 /**
 Waits for a signal on the semaphore.
 
@@ -4324,19 +4374,16 @@
 
 If the semaphore is deleted, all threads waiting on that semaphore are released.
 */
-	{
-
+EXPORT_C void RSemaphore::Wait()
+	{
 	Exec::SemaphoreWait(iHandle, 0);
 	}
 
 
-
-
-EXPORT_C TInt RSemaphore::Wait(TInt aTimeout)
 /**
 Waits for a signal on the semaphore, or a timeout.
 
-@param aTimeout The timeout value in micoseconds
+@param aTimeout The timeout value in microseconds
 
 @return KErrNone if the wait has completed normally.
         KErrTimedOut if the timeout has expired.
@@ -4345,12 +4392,26 @@
         KErrArgument if aTimeout is negative;
         otherwise one of the other system wide error codes.
 */
-	{
-
-	return Exec::SemaphoreWait(iHandle, aTimeout);
-	}
-
-
+EXPORT_C TInt RSemaphore::Wait(TInt aTimeout)
+	{
+	if (aTimeout>=0)
+		return Exec::SemaphoreWait(iHandle, aTimeout);
+	return KErrArgument;
+	}
+
+
+/**
+Acquires the semaphore if that is possible without waiting.
+
+@return KErrNone if the semaphore was acquired successfully
+        KErrTimedOut if the semaphore could not be acquired
+        KErrGeneral if the semaphore is being reset, i.e the semaphore
+        is about to  be deleted.
+*/
+EXPORT_C TInt RSemaphore::Poll()
+	{
+	return Exec::SemaphoreWait(iHandle, -1);
+	}
 
 
 EXPORT_C void RSemaphore::Signal()
@@ -4389,6 +4450,54 @@
 
 
 
+#ifndef __CPU_ARM
+/**
+Acquire the lock, if necessary waiting up to a specified maximum amount of time
+for it to become free.
+
+This function checks if the lock is currently held. If not the lock is marked
+as held by the current thread and the call returns immediately. If the lock is
+held by another thread the current thread will suspend until the lock becomes
+free or until the specified timeout period has elapsed.
+
+@param aTimeout The timeout value in microseconds
+
+@return KErrNone if the lock was acquired successfully.
+        KErrTimedOut if the timeout has expired.
+        KErrGeneral if the lock is being reset, i.e the lock
+        is about to  be deleted.
+        KErrArgument if aTimeout is negative;
+        otherwise one of the other system wide error codes.
+*/
+EXPORT_C TInt RFastLock::Wait(TInt aTimeout)
+	{
+	if (aTimeout<=0)
+		return KErrArgument;
+	TInt orig = __e32_atomic_add_acq32(&iCount, TUint32(-1));
+	if (orig == 0)
+		return KErrNone;
+	FOREVER
+		{
+		TInt r = Exec::SemaphoreWait(iHandle, aTimeout);
+		if (r != KErrTimedOut)	// got lock OK or lock deleted
+			return r;
+		// Before we can return KErrTimedOut we must increment iCount (since we
+		// previously decremented it in anticipation of acquiring the lock.
+		// However we must not increment iCount if it would become zero, since
+		// the semaphore will have been signalled (to counterbalance the Wait()
+		// which timed out and thus never happened). This would result in two
+		// threads being able to acquire the lock simultaneously - one by
+		// decrementing iCount from 0 to -1 without looking at the semaphore,
+		// and the other by decrementing iCount from -1 to -2 and then absorbing
+		// the spurious semaphore signal.
+		orig = __e32_atomic_tas_ord32(&iCount, -1, 0, 1);	// don't release lock completely
+		if (orig < -1)
+			return KErrTimedOut;	// count corrected - don't need to touch semaphore
+		// lock is actually free at this point, try again to claim it
+		aTimeout = 1;
+		}
+	}
+#endif
 
 EXPORT_C RCriticalSection::RCriticalSection()
 	: iBlocked(1)
--- a/kernel/eka/include/drivers/locmedia.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/drivers/locmedia.h	Tue Jul 06 15:50:07 2010 +0300
@@ -385,6 +385,7 @@
 		EDataPaging=0x40,			// a data paging request
 		ETClientBuffer=0x80,		// RemoteDes() points to a TClientBuffer
 		EKernelBuffer=0x100,		// RemoteDes() points to a kernel-side buffer : set for all paging requests and media extension requests
+		EPhysAddrOnly=0x200,        // No virtual address is available. Data Paging requests Only. 
 		};
 public:
     
@@ -1039,6 +1040,12 @@
 	inline static TBool PageInRequest(TLocDrvRequest& aReq);
 	inline static TBool PageOutRequest(TLocDrvRequest& aReq);
 	inline static TBool PagingRequest(TLocDrvRequest& aReq);
+		
+	virtual TInt WritePhysical(TThreadMessage* aReq, TPhysAddr* aPageArray, TUint aPageCount, TUint aOffset, TBool aBackground);
+	virtual TInt ReadPhysical(TThreadMessage* aReq, TPhysAddr* aPageArray, TUint aPageCount, TUint aOffset, TInt aDrvNumber);
+private:    
+    virtual TInt BaseRead(TThreadMessage* aReq,TUint32 aBuffer,TUint aOffset,TUint aSize,TInt aDrvNumber,TBool aPhysAddr);
+    virtual TInt BaseWrite(TThreadMessage* aReq,TUint32 aBuffer,TUint aOffset,TUint aSize, TBool aBackground,TBool aPhysAddr); 
 public:
 	TMessageQue iMainQ;
 	TMessageQue iDeferredQ;
--- a/kernel/eka/include/drivers/smppower/idlehelper.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/drivers/smppower/idlehelper.h	Tue Jul 06 15:50:07 2010 +0300
@@ -171,7 +171,7 @@
 	static void ClearIdleIPI();
 	static void DoWFI();//puts current CPU in wait for interrupt state
 	static TBool IsIntPending();
-	static TUint32	IntPending();
+	static TInt	IntPending();
 	static TUint32 GetTimerCount();//HW timer can be used for tracing
 	//Atomic checks used to synchronise cores going idle
 	static TBool ClearLocalAndCheckGlobalIdle(TUint32);
--- a/kernel/eka/include/e32cia.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/e32cia.h	Tue Jul 06 15:50:07 2010 +0300
@@ -39,6 +39,7 @@
 #define CSM_Z15PanicStrayEventv " PanicStrayEvent__Fv"
 #define CSM_ZN8CServer210BadMessageERK9RMessage2 " BadMessage__8CServer2RC9RMessage2"
 #define CSM_ZN10RSemaphore4WaitEv " Wait__10RSemaphore"
+#define CSM_ZN10RSemaphore4WaitEi " Wait__10RSemaphorei"
 #define CSM_Z34PanicCObjectConFindIndexOutOfRangev " PanicCObjectConFindIndexOutOfRange__Fv"
 #define CSM_ZN7TRegion5ClearEv " Clear__7TRegion"
 #define CSM_ZN4User5AllocEi " Alloc__4Useri"
@@ -73,6 +74,7 @@
 #define CSM_Z15PanicStrayEventv " __cpp(PanicStrayEvent)"
 #define CSM_ZN8CServer210BadMessageERK9RMessage2 " __cpp(CServer2::BadMessage)"
 #define CSM_ZN10RSemaphore4WaitEv " __cpp(static_cast<void (RSemaphore::*) ()>(&RSemaphore::Wait))"
+#define CSM_ZN10RSemaphore4WaitEi " __cpp(static_cast<TInt (RSemaphore::*) (TInt)>(&RSemaphore::Wait))"
 #define CSM_Z34PanicCObjectConFindIndexOutOfRangev " __cpp(PanicCObjectConFindIndexOutOfRange)"
 #define CSM_ZN7TRegion5ClearEv " __cpp(TRegion::Clear)"
 #define CSM_ZN4User5AllocEi " __cpp(User::Alloc)"
@@ -106,6 +108,7 @@
 #define CSM_Z15PanicStrayEventv " _Z15PanicStrayEventv"
 #define CSM_ZN8CServer210BadMessageERK9RMessage2 " _ZN8CServer210BadMessageERK9RMessage2"
 #define CSM_ZN10RSemaphore4WaitEv " _ZN10RSemaphore4WaitEv"
+#define CSM_ZN10RSemaphore4WaitEi " _ZN10RSemaphore4WaitEi"
 #define CSM_Z34PanicCObjectConFindIndexOutOfRangev " _Z34PanicCObjectConFindIndexOutOfRangev"
 #define CSM_ZN7TRegion5ClearEv " _ZN7TRegion5ClearEv"
 #define CSM_ZN4User5AllocEi " _ZN4User5AllocEi"
--- a/kernel/eka/include/e32cmn.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/e32cmn.h	Tue Jul 06 15:50:07 2010 +0300
@@ -2488,6 +2488,7 @@
 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
 	IMPORT_C void Wait();
 	IMPORT_C TInt Wait(TInt aTimeout);	// timeout in microseconds
+	IMPORT_C TInt Poll();		// acquire the semaphore if possible, but don't block
 	IMPORT_C void Signal();
 	IMPORT_C void Signal(TInt aCount);
 #endif
@@ -2511,6 +2512,8 @@
 	inline RFastLock();
 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
 	IMPORT_C void Wait();
+	IMPORT_C TInt Wait(TInt aTimeout);	// timeout in microseconds
+	IMPORT_C TInt Poll();		// acquire the lock if possible, but don't block
 	IMPORT_C void Signal();
 private:
 	TInt iCount;
--- a/kernel/eka/include/e32std.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/e32std.h	Tue Jul 06 15:50:07 2010 +0300
@@ -3314,6 +3314,8 @@
 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
 	IMPORT_C void Wait();
+	IMPORT_C TInt Poll();		// acquire the lock if possible, but don't block
+	IMPORT_C TInt Wait(TInt aTimeout);	// timeout in microseconds
 	IMPORT_C void Signal();
 	IMPORT_C TBool IsHeld();
 	};
--- a/kernel/eka/include/e32ver.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/e32ver.h	Tue Jul 06 15:50:07 2010 +0300
@@ -28,7 +28,7 @@
 
 const TInt KE32MajorVersionNumber=2;
 const TInt KE32MinorVersionNumber=0;
-const TInt KE32BuildVersionNumber=3093;
+const TInt KE32BuildVersionNumber=3098;
 
 const TInt KMachineConfigurationMajorVersionNumber=1;
 const TInt KMachineConfigurationMinorVersionNumber=0;
--- a/kernel/eka/include/emulator.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/emulator.h	Tue Jul 06 15:50:07 2010 +0300
@@ -33,6 +33,10 @@
 class TUidType;
 class TProcessCreateInfo;
 
+// Names of sections that we are interested in looking at.  These are used by the GetSectionsSize()
+// routine to determine the minimum number of bytes of a DLL to map into memory in order to examine
+// its sections.  If a new section is added here then it must also be added to the list of sections
+// held in the sectionNames array in GetSectionsSize()
 static const BYTE KWin32SectionName_Symbian[IMAGE_SIZEOF_SHORT_NAME]	= {'.','S','Y','M','B','I','A','N'};
 static const BYTE KWin32SectionName_Import[IMAGE_SIZEOF_SHORT_NAME]		= {'.','i','d','a','t','a','\0','\0'};
 static const BYTE KWin32SectionName_EpocData[IMAGE_SIZEOF_SHORT_NAME]	= {'.','d','a','t','a','\0','\0','\0'};
--- a/kernel/eka/include/kernel/kern_priv.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/kernel/kern_priv.h	Tue Jul 06 15:50:07 2010 +0300
@@ -745,7 +745,7 @@
 	void ChangePendingThreadPriority(DThread* aThread, TInt aNewPriority);
 	void WakeUpNextThread();
 public:
-	TInt Wait();
+	TInt Wait(TInt aTimeout=0);	// 0 means wait forever, -1 means poll, n>0 means n nanokernel ticks
 	void Signal();
 	void Reset();
 public:
@@ -2740,6 +2740,22 @@
 class M
 	{
 public:
+	/**
+	Flags to control the moving or discarding of a page via the methods M::DiscardPage(),
+	M::MovePage()and M::MoveAndAllocPage().
+	*/
+	enum TMoveDiscardFlags
+		{
+		/** Set this flag so dirty discardable page are moved rather than 
+			written to swap.
+		*/
+		EMoveDisMoveDirty = 0x1,
+		/** Set this so the attempt to allocate the location to move the page to 
+			will fail if the blocked RAM zone is reached.
+		*/
+		EMoveDisBlockRest = 0x2,
+		};
+
 	static void Init1();
 	static void Init2();
 #ifdef __SMP__
@@ -2786,9 +2802,10 @@
 	static void RamAllocIsLocked();
 	static TUint NumberOfFreeDpPages();
 	static TUint NumberOfDirtyDpPages();
-	static TInt MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
+	static TInt MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TUint aMoveDisFlags);
 	static TInt MoveAndAllocPage(TPhysAddr aAddr, TZonePageType aPageType);
-	static TInt DiscardPage(TPhysAddr aAddr, TUint aBlockZoneId, TBool aBlockRest);
+	static TInt DiscardPage(TPhysAddr aAddr, TUint aBlockZoneId, TUint aMoveDisFlags);
+	static TBool GetFreePages(TUint aNumPages);
 	static void RamZoneClaimed(SZone* aZone);
 	static TInt RamDefragFault(TAny* aExceptionInfo);
 	};
--- a/kernel/eka/include/kernel/kernel.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/kernel/kernel.h	Tue Jul 06 15:50:07 2010 +0300
@@ -2793,6 +2793,12 @@
 		EDriveDataPaging = -2,	/**< Special drive number to indicate data paging. */
 		};
 
+	/** Additional flags. */
+	enum TFlags
+		{
+		ESupportsPhysicalAccess = 1<<0,  /**< Supports ReadPhysical and WritePhysical methods. */
+		};
+
 	/**
 	Called by the paging system to read data from the media represented by this
 	device.
@@ -2844,6 +2850,55 @@
 	IMPORT_C NFastMutex* NotificationLock();
 	
 	/**
+	Called by the paging system to read data from the media represented by this device using
+	physical addresses, if the device supports it.
+	
+	This is intended to allow reading pages from swap without needing to map them first, and should
+	be implemented by media drivers that support DMA access.
+
+	If this method is implemented, the ESupportsPhysicalAccess flag in iFlags must be set as well.
+
+	The default implementation of this method just returns KErrNotSupported.
+
+	@param aPageArray   Pointer to array of physical address to write to.
+	@param aPageCount   Number of physical pages to read.
+	@param aOffset      The offset from the media start, in read units, from where data should be read.
+	
+	@param aDrvNumber The drive number for code paging or a member of TSpecialDrives for rom or data
+	paging.
+
+	@return KErrNone or standard error code.
+	*/
+	inline virtual TInt ReadPhysical(TThreadMessage* aReq, TPhysAddr* aPageArray, TUint aPageCount, TUint aOffset, TInt aDrvNumber);
+
+	/**
+	Called by the paging system to write data to the media represented by this device using physical
+	addresses, if the device supports it.
+
+	This is only used in the implementation of data paging to write to the swap partition.
+
+	This method takes a pointer to an array of physical addresses and the number of pages to write,
+	in contrast to #Write which takes a logical address and a number of read units.
+
+	This is intended to allow writing pages to swap without needing to map them first, and should be
+	implelemented by media drivers that support DMA access.
+
+	If this method is implemented, the ESupportsPhysicalAccess flag in iFlags must be set as well.
+
+	The default implementation of this method just returns KErrNotSupported.
+
+	@param aPageArray   Pointer to array of physical address to read from.
+	@param aPageCount   Number of physical pages to write.
+	@param aOffset      The offset from the media start, in read units, to where data should be
+		   			    written.
+	@param aBackground  If set, this indicates that the request should not count as making the 
+		   				device busy.
+
+	@return KErrNone or standard error code.
+	*/
+	inline virtual TInt WritePhysical(TThreadMessage* aReq, TPhysAddr* aPageArray, TUint aPageCount, TUint aOffset, TBool aBackground);
+	
+	/**
 	Called by the paging device to notify the kernel that the device has just become idle and is not
 	currently processing any requests.
 
@@ -2867,7 +2922,10 @@
 	
 public:
 	/** The type of device this represents. */
-	TUint32 iType;
+	TUint16 iType;
+
+	/** Flags bitfield made up of members of TFlags. */
+	TUint16 iFlags;
 
 	/** The local drives supported for code paging.
 	    This is a bitmask containing one bit set for each local drive supported, where the bit set
@@ -2902,20 +2960,48 @@
 	*/
 	DPagingRequestPool* iRequestPool;
 
+	/** Log2 of the media's preferred write size in bytes.
+
+		E.g. if the preferred write size is 16KB, this should be set 14.
+		
+		Some media may exhibit poor performance unless writes happen in multiples of the superpage
+		size.  In this case the media driver would set this field to indicate the write size, and
+		the kernel will attempt to:
+		
+		 - write in multiples of the preferred size
+		 - align writes to multiples of the preferred size
+
+		Note that this value cannot be less the size of a page (eg 12) and there may be a maximum
+		limit to what the kernel will write as well.
+	*/
+	TUint32 iPreferredWriteShift;
+
 	/** Reserved for future use.
 	*/
-	TInt iSpare[4];
+	TInt iSpare[3];
 	};
 
-inline TInt DPagingDevice::Write(TThreadMessage*,TLinAddr,TUint,TUint,TBool)
+inline TInt DPagingDevice::Write(TThreadMessage*, TLinAddr, TUint, TUint, TBool)
+	{
+	// Default implementation, may be overriden by derived classes
+	return KErrNotSupported;
+	}
+
+inline TInt DPagingDevice::ReadPhysical(TThreadMessage*, TPhysAddr*, TUint, TUint, TInt)
 	{
-	// Default implementation, may be overriden by dervied classes
+	// Default implementation, may be overriden by derived classes
+	return KErrNotSupported;
+	}
+	
+inline TInt DPagingDevice::WritePhysical(TThreadMessage*, TPhysAddr*, TUint, TUint, TBool)
+	{
+	// Default implementation, may be overriden by derived classes
 	return KErrNotSupported;
 	}
 
 inline TInt DPagingDevice::DeleteNotify(TThreadMessage*,TUint,TUint)
 	{
-	// Default implementation, may be overriden by dervied classes
+	// Default implementation, may be overriden by derived classes
 	return KErrNotSupported;
 	}
 
--- a/kernel/eka/include/kernel/sproperty.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/kernel/sproperty.h	Tue Jul 06 15:50:07 2010 +0300
@@ -95,7 +95,19 @@
 
 private:
 	friend class TProperty;
-	DProcess*	iProcess;
+
+	/**
+    Defines the context of iProcess.
+    @internalComponent
+    */
+	enum {KScheduledForCompletion = 1, KProcessPtrMask = 0xfffffffe};
+
+    /**
+    The process that has required notification.
+    LSB is set if the request is scheduled for completition.
+    */
+    DProcess*   iProcess;
+
 	};
 
 
--- a/kernel/eka/include/memmodel/epoc/mmubase/mmubase.inl	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/memmodel/epoc/mmubase/mmubase.inl	Tue Jul 06 15:50:07 2010 +0300
@@ -81,15 +81,17 @@
 	}
 
 
-inline TInt M::MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest)
+inline TInt M::MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TUint aMoveDisFlags)
 	{
-	return Mmu::Get().MovePage(aOld, aNew, aBlockZoneId, aBlockRest);
+	return Mmu::Get().MovePage(	aOld, aNew, aBlockZoneId, 
+								(aMoveDisFlags & M::EMoveDisBlockRest)!=0);
 	}
 
 
-inline TInt M::DiscardPage(TPhysAddr aAddr, TUint aBlockZoneId, TBool aBlockRest)
+inline TInt M::DiscardPage(TPhysAddr aAddr, TUint aBlockZoneId, TUint aMoveDisFlags)
 	{
-	return Mmu::Get().DiscardPage(aAddr, aBlockZoneId, aBlockRest);
+	return Mmu::Get().DiscardPage(	aAddr, aBlockZoneId, 
+									(aMoveDisFlags & M::EMoveDisBlockRest)!=0);
 	}
 #endif
 
--- a/kernel/eka/include/memmodel/epoc/mmubase/ramalloc.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/memmodel/epoc/mmubase/ramalloc.h	Tue Jul 06 15:50:07 2010 +0300
@@ -144,10 +144,11 @@
 	TInt ZoneAllocRamPages(TUint* aZoneIdList, TUint aZoneIdCount, TPhysAddr* aPageList, TInt aNumPages, TZonePageType aType);
 	TInt AllocContiguousRam(TUint aNumPages, TPhysAddr& aPhysAddr, TInt aAlign=0);
 #if !defined(__MEMMODEL_MULTIPLE__) && !defined(__MEMMODEL_MOVING__)
-	void BlockContiguousRegion(TPhysAddr aAddrBase, TUint aNumPages);
+	TUint BlockContiguousRegion(TPhysAddr aAddrBase, TUint aNumPages);
 	void UnblockSetAllocRuns(TUint& aOffset1, TUint& aOffset2, TUint aRunLength1, TUint aRunLength2, TUint& aAllocLength, TUint& aAllocStart);
 	void UnblockContiguousRegion(TPhysAddr aAddrBase, TUint aNumPages);
-	TBool ClearContiguousRegion(TPhysAddr aAddrBase, TPhysAddr aZoneBase, TUint aNumPages, TInt& aOffset);
+	TBool ClearContiguousRegion(TPhysAddr aAddrBase, TPhysAddr aZoneBase, TUint aNumPages, TInt& aOffsetm, TUint aUnreservedPages);
+	TUint CountPagesInRun(TPhysAddr aAddrBase, TPhysAddr aAddrEndPage, TZonePageType aType);
 #endif
 	TInt ZoneAllocContiguousRam(TUint* aZoneIdList, TUint aZoneIdCount, TInt aSize, TPhysAddr& aPhysAddr, TInt aAlign);
 #ifdef _DEBUG
--- a/kernel/eka/include/nkern/nk_cpu.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkern/nk_cpu.h	Tue Jul 06 15:50:07 2010 +0300
@@ -688,6 +688,8 @@
 #error SMP not allowed without thread ID registers
 #endif
 
+#define	__SRATIO_MACHINE_CODED__
+
 #endif	//	end of __CPU_ARM
 
 #if defined(__CPU_X86) && defined(__EPOC32__)
--- a/kernel/eka/include/nkern/nklib.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkern/nklib.h	Tue Jul 06 15:50:07 2010 +0300
@@ -85,6 +85,39 @@
 	};
 
 
+/**
+@internalComponent
+
+Ratio represented = iM*2^iX
+e.g. 1.0 has iM=0x80000000, iX=-31
+*/
+struct SRatio
+	{
+	void Set(TUint32 aInt, TInt aDivisorExp=0);		// set this ratio to aInt/2^aDivisorExp
+	TInt Reciprocal();								// this = 1/this
+	TInt Mult(TUint32& aInt32);						// Multiply aInt32 by this ratio
+//	TInt Mult(TUint64& aInt64);						// Multiply aInt64 by this ratio
+
+	TUint32		iM;		// mantissa, normalised so bit 31=1
+	TInt16		iX;		// -exponent.
+	TUint8		iSpare1;
+	TUint8		iSpare2;
+	};
+
+/**
+@internalComponent
+
+Ratio and inverse ratio
+*/
+struct SRatioInv
+	{
+	void Set(const SRatio* aR);
+
+	SRatio		iR;
+	SRatio		iI;
+	};
+
+
 #if defined(__VC32__) || defined(__CW32__)
 extern "C"
 /** @internalComponent */
--- a/kernel/eka/include/nkernsmp/arm/ncern.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkernsmp/arm/ncern.h	Tue Jul 06 15:50:07 2010 +0300
@@ -97,20 +97,6 @@
 
 __ASSERT_COMPILE(sizeof(SPerCpuUncached) <= 8*sizeof(TUint64));
 
-/** Timer frequency specification
-
-Stores a frequency as a fraction of a (separately stored) maximum.
-The frequency must be at least 1/256 of the maximum.
-
-@internalTechnology
-@prototype
-*/
-struct STimerMult
-	{
-	TUint32		iFreq;						// frequency as a fraction of maximum possible, multiplied by 2^32
-	TUint32		iInverse;					// 2^24/(iFreq/2^32) = 2^56/iFreq
-	};
-
 /** Function to power up a CPU
 @publishedPartner
 @prototype
@@ -123,6 +109,12 @@
 */
 typedef void (*TCpuPowerDownFn)(TInt aCpu, SPerCpuUncached* aU);
 
+/** Function to notify changes to system clock frequencies
+@publishedPartner
+@prototype
+*/
+typedef TInt (*TFrequencyChangeFn)();
+
 /** Variant interface block
 @internalTechnology
 @prototype
@@ -138,11 +130,13 @@
 	TLinAddr	iGicCpuIfcAddr;				// address of GIC CPU interface (must be same for all CPUs)
 	TLinAddr	iLocalTimerAddr;			// address of per-CPU timer (must be same for all CPUs)
 	TLinAddr	iGlobalTimerAddr;			// address of global timer if it exists
-	volatile STimerMult*	iTimerMult[KMaxCpus];	// timer[i] frequency / iMaxTimerClock * 2^32
-	volatile TUint32*		iCpuMult[KMaxCpus];		// CPU[i] frequency / iMaxCpuClock * 2^32
+	SRatio*		iTimerFreqR[KMaxCpus];		// timer[i] frequency as a fraction of iMaxTimerClock
+	SRatio*		iCpuFreqR[KMaxCpus];		// CPU[i] frequency as a fraction of iMaxCpuClock
 	UPerCpuUncached*		iUncached[KMaxCpus];	// Pointer to uncached memory for each CPU
 	TCpuPowerUpFn			iCpuPowerUpFn;			// function used to power up a retired CPU (NULL if core control not supported)
 	TCpuPowerDownFn			iCpuPowerDownFn;		// function used to power down a CPU (NULL if power down done within idle handler itself)
+	SRatio*		iGTimerFreqR;				// global timer frequency as a fraction of iMaxTimerClock
+	TFrequencyChangeFn		iFrqChgFn;		// function to notify frequency changes
 	};
 
 // End of file
--- a/kernel/eka/include/nkernsmp/arm/nk_plat.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkernsmp/arm/nk_plat.h	Tue Jul 06 15:50:07 2010 +0300
@@ -66,35 +66,12 @@
 	TLinAddr			iUndStackTop;			// Top of UND stack for this CPU
 	TLinAddr			iFiqStackTop;			// Top of FIQ stack for this CPU
 	TLinAddr			iIrqStackTop;			// Top of IRQ stack for this CPU
-	volatile TUint32	iCpuFreqM;				// CPU frequency / Max CPU frequency (mantissa, bit 31=1) f/fmax=mantissa/2^shift
-	volatile TInt		iCpuFreqS;				// CPU frequency / Max CPU frequency (shift)
-	volatile TUint32	iCpuPeriodM;			// Max CPU frequency / CPU frequency (mantissa, bit 31=1) fmax/f=mantissa/2^shift
-	volatile TInt		iCpuPeriodS;			// Max CPU frequency / CPU frequency (shift)
-	volatile TUint32	iNTimerFreqM;			// Nominal Timer frequency / Max Timer frequency (mantissa, bit 31=1) f/fmax=mantissa/2^shift
-	volatile TInt		iNTimerFreqS;			// Nominal Timer frequency / Max Timer frequency (shift)
-	volatile TUint32	iNTimerPeriodM;			// Nominal Max Timer frequency / Timer frequency (mantissa, bit 31=1) fmax/f=mantissa/2^shift
-	volatile TInt		iNTimerPeriodS;			// Nominal Max Timer frequency / Timer frequency (shift)
-	volatile TUint32	iTimerFreqM;			// Timer frequency / Max Timer frequency (mantissa, bit 31=1) f/fmax=mantissa/2^shift
-	volatile TInt		iTimerFreqS;			// Timer frequency / Max Timer frequency (shift)
-	volatile TUint32	iTimerPeriodM;			// Max Timer frequency / Timer frequency (mantissa, bit 31=1) fmax/f=mantissa/2^shift
-	volatile TInt		iTimerPeriodS;			// Max Timer frequency / Timer frequency (shift)
-	volatile TUint64	iLastSyncTime;			// Timestamp at which last reference check occurred
-	volatile TUint32	iTicksSinceLastSync;	// Local timer ticks between last ref. check and next zero crossing
-	volatile TUint32	iLastTimerSet;			// Value last written to local timer counter
-	volatile TUint32	iGapEstimate;			// 2^16 * estimated gap in ticks whenever local timer counter is read then written
-	volatile TUint32	iGapCount;				// count of local timer counter RMW ops
-	volatile TUint32	iTotalTicks;			// programmed ticks since last sync
-	volatile TUint32	iDitherer;				// PRNG state for dither generation
-	volatile TInt		iFreqErrorEstimate;		// Current frequency offset between local timer and reference
-	volatile TInt		iFreqErrorLimit;		// Saturation level for frequency offset
-	volatile TInt64		iErrorIntegrator;		// Accumulator to integrate time error measurements
-	volatile TUint64	iRefAtLastCorrection;	// Value of reference timer at last correction
-	volatile TUint8		iM;						// Value controlling loop bandwidth (larger->lower loop bandwidth)
-	volatile TUint8		iN;						// Number of timer ticks between corrections = 2^iN
-	volatile TUint8		iD;						// Value controlling loop damping
-	volatile TUint8		iSSXP1;
+	SRatioInv* volatile	iNewCpuFreqRI;			// set when CPU frequency has been changed
+	SRatioInv* volatile	iNewTimerFreqRI;		// set when CPU local timer frequency has been changed
+	SRatioInv			iCpuFreqRI;				// Ratio of CPU frequency to maximum possible CPU frequency
+	SRatioInv			iTimerFreqRI;			// Ratio of CPU local timer frequency to maximum possible
 
-	TUint32				iSSXP2[19];
+	TUint32				iSSXP2[36];
 	TUint64				iSSXP3;					// one 64 bit value to guarantee alignment
 	};
 
@@ -108,7 +85,12 @@
 	GicDistributor*		iGicDistAddr;			// Address of GIC Distributor (also in TSubScheduler)
 	GicCpuIfc*			iGicCpuIfcAddr;			// Address of GIC CPU Interface (also in TSubScheduler)
 	ArmLocalTimer*		iLocalTimerAddr;		// Address of local timer registers (also in TSubScheduler)
-	TUint32				iSXP2[8];
+
+	SRatioInv			iGTimerFreqRI;			// ratio of global timer frequency to maximum possible
+	TUint64				iCount0;				// global timer count at last frequency change
+	TUint64				iTimestamp0;			// timestamp at last frequency change
+
+	TUint32				iSXP2[16];
 	};
 
 
--- a/kernel/eka/include/nkernsmp/nk_priv.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkernsmp/nk_priv.h	Tue Jul 06 15:50:07 2010 +0300
@@ -629,6 +629,7 @@
 __ASSERT_COMPILE(sizeof(TSubScheduler)==(1<<KSubSchedulerShift));	// make it a nice power of 2 size for easy indexing
 
 struct SCoreControlAction;
+struct SVariantInterfaceBlock;
 
 /**
 @internalComponent
@@ -669,6 +670,7 @@
 	static TBool CoreControlSupported();
 	static void CCInitiatePowerUp(TUint32 aCores);
 	static void CCIndirectPowerDown(TAny*);
+	static void DoFrequencyChanged(TAny*);
 public:
 	TLinAddr		iMonitorExceptionHandler;
 	TLinAddr		iProcessHandler;
@@ -727,11 +729,13 @@
 	TDfc			iCCRequestDfc;				// runs when a request is made to change the number of active cores
 	TDfc			iCCPowerDownDfc;			// runs when indirect power down of core(s) is required
 	TDfc			iCCIpiReactIDFC;			// runs when an IPI needs to wake up a core
+	TDfc			iFreqChgDfc;				// runs when frequency changes required
 
 	TSubScheduler*	iPoweringOff;				// CPU last to power off
 	TUint32			iDetachCount;				// detach count before power off
 
-	TUint32			i_Scheduler_Padding[54];
+	SVariantInterfaceBlock* iVIB;
+	TUint32			i_Scheduler_Padding[29];
 	};
 
 __ASSERT_COMPILE(!(_FOFF(TScheduler,iGenIPILock)&7));
@@ -739,7 +743,7 @@
 __ASSERT_COMPILE(!(_FOFF(TScheduler,iIdleBalanceLock)&7));
 __ASSERT_COMPILE(!(_FOFF(TScheduler,iEnumerateLock)&7));
 __ASSERT_COMPILE(!(_FOFF(TScheduler,iBalanceListLock)&7));
-__ASSERT_COMPILE(sizeof(TSchedulerX)==16*4);
+__ASSERT_COMPILE(sizeof(TSchedulerX)==32*4);
 __ASSERT_COMPILE(sizeof(TScheduler)==1024);
 
 extern TScheduler TheScheduler;
--- a/kernel/eka/include/nkernsmp/nkern.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkernsmp/nkern.h	Tue Jul 06 15:50:07 2010 +0300
@@ -1243,7 +1243,7 @@
 class TStopIPI : public TGenericIPI
 	{
 public:
-	void StopCPUs();
+	TUint32 StopCPUs();
 	void ReleaseCPUs();
 	static void Isr(TGenericIPI*);
 public:
--- a/kernel/eka/include/nkernsmp/x86/ncern.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkernsmp/x86/ncern.h	Tue Jul 06 15:50:07 2010 +0300
@@ -36,20 +36,6 @@
 	{
 	};
 
-/** Timer frequency specification
-
-Stores a frequency as a fraction of a (separately stored) maximum.
-The frequency must be at least 1/256 of the maximum.
-
-@internalTechnology
-@prototype
-*/
-struct STimerMult
-	{
-	TUint32		iFreq;						// frequency as a fraction of maximum possible, multiplied by 2^32
-	TUint32		iInverse;					// 2^24/(iFreq/2^32) = 2^56/iFreq
-	};
-
 /** Variant interface block
 @internalTechnology
 @prototype
@@ -59,8 +45,9 @@
 	TUint64		iMaxCpuClock;				// maximum possible CPU clock frequency on this system
 	TUint32		iTimestampFreq;				// rate at which timestamp increments
 	TUint32		iMaxTimerClock;				// maximum possible local timer clock frequency
-	volatile STimerMult* iTimerMult[KMaxCpus];	// timer[i] frequency as a fraction of iMaxTimerClock
-	volatile TUint32* iCpuMult[KMaxCpus];	// CPU[i] frequency / iMaxCpuClock * 2^32
+	SRatio*		iTimerFreqR[KMaxCpus];		// timer[i] frequency as a fraction of iMaxTimerClock
+	SRatio*		iCpuFreqR[KMaxCpus];		// CPU[i] frequency as a fraction of iMaxCpuClock
+	SRatio*		iTimestampFreqR;			// timestamp counter frequency as a fraction of
 	};
 
 // End of file
--- a/kernel/eka/include/nkernsmp/x86/nk_plat.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/nkernsmp/x86/nk_plat.h	Tue Jul 06 15:50:07 2010 +0300
@@ -42,21 +42,12 @@
 	volatile TInt		iIrqNestCount;			// IRQ nest count for this CPU (starts at -1)
 	TLinAddr			iIrqStackTop;			// Top of IRQ stack for this CPU
 	TX86Tss*			iTss;					// Address of TSS for this CPU
-	volatile TUint32	iCpuFreqM;				// CPU frequency / Max CPU frequency (mantissa, bit 31=1) f/fmax=M/2^(S+32) <=1
-	volatile TInt		iCpuFreqS;				// CPU frequency / Max CPU frequency (shift)
-	volatile TUint32	iCpuPeriodM;			// Max CPU frequency / CPU frequency (mantissa, bit 31=1) fmax/f=M/2^S >=1
-	volatile TInt		iCpuPeriodS;			// Max CPU frequency / CPU frequency (shift)
-	volatile TUint32	iNTimerFreqM;			// Nominal Timer frequency / Max Timer frequency (mantissa, bit 31=1) f/fmax=M/2^(S+32) <=1
-	volatile TInt		iNTimerFreqS;			// Nominal Timer frequency / Max Timer frequency (shift)
-	volatile TUint32	iNTimerPeriodM;			// Nominal Max Timer frequency / Timer frequency (mantissa, bit 31=1) fmax/f=M/2^S >=1
-	volatile TInt		iNTimerPeriodS;			// Nominal Max Timer frequency / Timer frequency (shift)
-	volatile TUint32	iTimerFreqM;			// Timer frequency / Max Timer frequency (mantissa, bit 31=1) f/fmax=M/2^(S+32) <=1
-	volatile TInt		iTimerFreqS;			// Timer frequency / Max Timer frequency (shift)
-	volatile TUint32	iTimerPeriodM;			// Max Timer frequency / Timer frequency (mantissa, bit 31=1) fmax/f=M/2^S >=1
-	volatile TInt		iTimerPeriodS;			// Max Timer frequency / Timer frequency (shift)
+	SRatioInv			iCpuFreqRI;				// Ratio of CPU frequency to maximum possible CPU frequency
+	SRatioInv			iTimerFreqRI;			// Ratio of CPU local timer frequency to maximum possible
+
 	volatile TUint64HL	iTimestampOffset;		// 64 bit value to add to CPU TSC to give NKern::Timestamp()
 
-	TUint32				iSSXP2[32];
+	TUint32				iSSXP2[36];
 	TUint64				iSSXP3;					// one 64 bit value to guarantee alignment
 	};
 
@@ -64,7 +55,7 @@
 struct TSchedulerX
 	{
 	TUint64				iTimerMax;				// Maximum per-CPU timer frequency (after prescaling)
-	TUint32				iSXP[14];
+	TUint32				iSXP[30];
 	};
 
 
--- a/kernel/eka/include/u32hal.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/u32hal.h	Tue Jul 06 15:50:07 2010 +0300
@@ -2790,6 +2790,59 @@
 	@see TChanges
 	*/ 
 	EVMHalSetThrashThresholds,
+
+	/**
+	Indicate whether the data paging media driver supports access by physical address.
+
+	@return 1 if it does, 0 if it does not and KErrNotSupported if data paging is not enabled.
+	*/
+	EVMHalGetPhysicalAccessSupported,
+
+	/**
+	Indicate whether the data paging media driver currently uses physical access for writing out
+	dirty data pages to swap.
+
+	@return 1 if it does, 0 if it does not and KErrNotSupported if data paging is not enabled.
+	*/
+	EVMHalGetUsePhysicalAccess,
+
+	/**
+	Set whether physical access is used for writing out dirty data pages to swap.
+
+	The first argument (a1) should contain zero or one to indicate whether to disable or enable
+	physical access respectively.
+	
+	@return KErrNone if successful, KErrNotSupported if data paging is not enabled.
+	*/
+	EVMHalSetUsePhysicalAccess,
+
+	/**
+	Get the data paging media driver's preferred write size.
+
+	@return Log2 of the preferred write size in pages, or KErrNotSupported if data paging is not
+	enabled.
+	*/
+	EVMHalGetPreferredDataWriteSize,
+
+	/**
+	Get the number of pages that the pager attempts to write at a time when paging out dirty pages
+	to swap.
+
+	@return Log2 of the current write size in pages, or KErrNotSupported if data paging is not
+	enabled.
+	*/
+	EVMHalGetDataWriteSize,
+
+	/**
+	Set the number of pages that the pager attempts to write at a time when paging out dirty pages
+	to swap.
+	
+	The first argument (a1) should contain log2 of the write size in pages.
+
+	@return KErrArgument if the value is out of range, or KErrNotSupported if data paging is not
+	enabled.
+	*/
+	EVMHalSetDataWriteSize,
 	};
 
 
--- a/kernel/eka/include/u32std.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/include/u32std.h	Tue Jul 06 15:50:07 2010 +0300
@@ -508,6 +508,8 @@
 	EKernelConfigSMPUnsafeCPU0   = 1<<13,				// Slow compatibility mode: all SMP-unsafe processes run on CPU 0 only
 	EKernelConfigSMPCrazyInterrupts = 1<<14,			// Enables CPU target rotation for HW Interrupts.
 
+	EKernelConfigSMPLockKernelThreadsCore0 = 1<< 15,    // locks all kernel side threads to CPU 0
+
 	EKernelConfigDisableAPs = 1u<<30,
 
 	EKernelConfigTest = 1u<<31,							// Only used by test code for __PLATSEC_UNLOCKED__
--- a/kernel/eka/kernel/execs.txt	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/kernel/execs.txt	Tue Jul 06 15:50:07 2010 +0300
@@ -680,6 +680,8 @@
 
 slow {
 	name = MutexWait
+	return = TInt
+	arg2 = TInt
 	handle = mutex
 }
 
--- a/kernel/eka/kernel/sexec.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/kernel/sexec.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -96,14 +96,26 @@
 	return aChunk->Top();
 	}
 
-void ExecHandler::MutexWait(DMutex* aMutex)
+TInt ExecHandler::MutexWait(DMutex* aMutex, TInt aTimeout)
 //
 // Wait for the mutex.
 //
 	{
-
-//	__KTRACE_OPT(KEXEC,Kern::Printf("Exec::MutexWait"));
-	aMutex->Wait();
+	if (aTimeout)	// 0 means wait forever, -1 means poll
+		{
+		if (aTimeout<-1)
+			{
+			return KErrArgument;
+			}
+		if (aTimeout>0)
+			{
+			// Convert microseconds to NTimer ticks, rounding up
+			TInt ntp = NKern::TickPeriod();
+			aTimeout += ntp-1;
+			aTimeout /= ntp;
+			}
+		}
+	return aMutex->Wait(aTimeout);
 	}
 
 void ExecHandler::MutexSignal(DMutex* aMutex)
@@ -555,20 +567,21 @@
 // Wait for a signal.
 //
 	{
-
 	__KTRACE_OPT(KEXEC,Kern::Printf("Exec::SemaphoreWait"));
-	if (aTimeout)
+	if (aTimeout)	// 0 means wait forever, -1 means poll
 		{
-		if (aTimeout<0)
+		if (aTimeout<-1)
 			{
 			NKern::UnlockSystem();
 			return KErrArgument;
 			}
-
-		// Convert microseconds to NTimer ticks, rounding up
-		TInt ntp = NKern::TickPeriod();
-		aTimeout += ntp-1;
-		aTimeout /= ntp;
+		if (aTimeout>0)
+			{
+			// Convert microseconds to NTimer ticks, rounding up
+			TInt ntp = NKern::TickPeriod();
+			aTimeout += ntp-1;
+			aTimeout /= ntp;
+			}
 		}
 	return aSemaphore->Wait(aTimeout);
 	}
--- a/kernel/eka/kernel/sinit.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/kernel/sinit.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -377,6 +377,7 @@
 
 	pN->iFlags |= KThreadFlagSystemPermanent; // supervisor thread can't exit for any reason
 
+	K::SvThread=pN;
 	K::TheKernelThread=pN;
 	K::SvMsgQ->iThread=&pN->iNThread;
 	K::SvBarrierQ.SetDfcQ(K::SvMsgQ);
--- a/kernel/eka/kernel/skernel.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/kernel/skernel.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -74,6 +74,9 @@
 
 // Wait for semaphore with timeout
 // Enter with system locked, return with system unlocked.
+// If aNTicks==0, wait forever
+// If aNTicks==-1, poll (don't block)
+// If aNTicks>0, timeout is aNTicks nanokernel ticks
 TInt DSemaphore::Wait(TInt aNTicks)
 	{
 	__KTRACE_OPT(KSEMAPHORE,Kern::Printf("Semaphore %O Wait %d Timeout %d",this,iCount,aNTicks));
@@ -84,14 +87,23 @@
 		r=KErrGeneral;
 	else if (--iCount<0)
 		{
-		DThread* pC=TheCurrentThread;
-		pC->iMState=DThread::EWaitSemaphore;
-		pC->iWaitObj=this;
-		iWaitQ.Add(pC);
-		BTRACE_KS(BTrace::ESemaphoreBlock, this);
-		r=NKern::Block(aNTicks,NKern::ERelease,SYSTEM_LOCK);
-		__ASSERT_DEBUG(pC->iMState==DThread::EReady,K::Fault(K::ESemWaitBadState));
-		COND_BTRACE_KS(r==KErrNone, BTrace::ESemaphoreAcquire, this);
+		if (aNTicks >= 0)
+			{
+			DThread* pC=TheCurrentThread;
+			pC->iMState=DThread::EWaitSemaphore;
+			pC->iWaitObj=this;
+			iWaitQ.Add(pC);
+			BTRACE_KS(BTrace::ESemaphoreBlock, this);
+			r=NKern::Block(aNTicks,NKern::ERelease,SYSTEM_LOCK);
+			__ASSERT_DEBUG(pC->iMState==DThread::EReady,K::Fault(K::ESemWaitBadState));
+			COND_BTRACE_KS(r==KErrNone, BTrace::ESemaphoreAcquire, this);
+			}
+		else
+			{
+			++iCount;
+			NKern::UnlockSystem();
+			r = KErrTimedOut;	// couldn't acquire semaphore immediately, so fail
+			}
 		return r;
 		}
 #ifdef BTRACE_SYMBIAN_KERNEL_SYNC
@@ -326,10 +338,14 @@
 extern const SNThreadHandlers EpocThreadHandlers;
 #endif
 
-// Enter and return with system locked.
-TInt DMutex::Wait()
+// Wait for mutex with timeout
+// Enter with system locked, return with system unlocked.
+// If aNTicks==0, wait forever
+// If aNTicks==-1, poll (don't block)
+// If aNTicks>0, timeout is aNTicks nanokernel ticks
+TInt DMutex::Wait(TInt aNTicks)
 	{
-	__KTRACE_OPT(KSEMAPHORE,Kern::Printf("Mutex %O Wait hold %O hldc=%d wtc=%d",this,iCleanup.iThread,iHoldCount,iWaitCount));
+	__KTRACE_OPT(KSEMAPHORE,Kern::Printf("Mutex %O Wait(%d) hold %O hldc=%d wtc=%d",this,aNTicks,iCleanup.iThread,iHoldCount,iWaitCount));
 	__ASSERT_SYSTEM_LOCK;
 	__ASSERT_DEBUG(NCurrentThread()->iHandlers==&EpocThreadHandlers, K::Fault(K::EMutexWaitNotDThread));
 	DThread* pC=TheCurrentThread;
@@ -353,6 +369,8 @@
 			BTRACE_KS(BTrace::EMutexAcquire, this);
 			return KErrNone;
 			}
+		if (aNTicks<0)
+			return KErrTimedOut;	// poll mode - can't get mutex immediately so fail
 		K::PINestLevel=0;
 		pC->iMState=DThread::EWaitMutex;
 		pC->iWaitObj=this;
@@ -375,7 +393,7 @@
 		// return value is set at the point where the thread is released from its wait
 		// condition). However we can still detect this situation since the thread will
 		// have been placed into the EReady state when the mutex was reset.
-		TInt r=NKern::Block(0, NKern::ERelease|NKern::EClaim|NKern::EObstruct, SYSTEM_LOCK);
+		TInt r=NKern::Block(aNTicks, NKern::ERelease|NKern::EClaim|NKern::EObstruct, SYSTEM_LOCK);
 		if (r==KErrNone && pC->iMState==DThread::EReady)
 			r = KErrGeneral;	// mutex has been reset
 		if (r!=KErrNone)		// if we get an error here...
--- a/kernel/eka/kernel/sproperty.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/kernel/sproperty.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -29,6 +29,14 @@
 	return TheCurrentThread->iOwningProcess;
 	}
 
+// Used by a thread to schedule cancelation of Subscribe request in Supervisor thread.
+class TCancelQ: public SDblQueLink
+{
+public:
+    TPropertySubsRequest* iPropSubRequest;//The request to be cancelled, can be NULL
+    NFastSemaphore iFSemaphore;//Semafore to be signalled by Supervisor thread after the request is cancelled.
+};
+
 class TProperty 
 	{
 public:
@@ -112,7 +120,10 @@
 	static void CompleteRequest(TPropertySubsRequest*, TInt aReason);	
 	static void CompleteQue(SDblQue* aQue, TInt aReason);	
 	static void CompleteDfc(TAny* aQue);
-
+	static void CompleteDfcByKErrPermissionDenied(TAny* aQue);
+	static void CompleteDfcByKErrNotFound(TAny* aQue);
+	static void CompleteCancellationQDfc(TAny* aQue);
+	
 	static TUint Hash(TUint aCategory, TUint aKey);
 	static TProperty** Lookup(TUint aCategory, TUint aKey);
 	static TInt LookupOrCreate(TUint aCategory, TUint aKey, TProperty**);
@@ -186,10 +197,17 @@
 
 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
 
-	enum { KCompletionDfcPriority = 2 };
+	enum { KCancellationDfcPriority = 1, KCompletionDfcPriority = 2  };
 	static TDfc		CompletionDfc;
-	// subscriptions to be completed by the DFC
-	static SDblQue	CompletionQue;		// protected by the system lock
+	static TDfc		CompletionDfcPermissionDenied;
+	static TDfc		CompletionDfcNotFound;
+	static TDfc		CancellationDfc;
+	
+	// subscriptions to be completed by the DFCs, protected by system lock
+	static SDblQue	CompletionQue; // to be completed by KerrNone
+	static SDblQue	CompletionQuePermissionDenied;
+	static SDblQue	CompletionQueNotFound;
+	static SDblQue	CancellationQue;		
 
 	static DMutex*	FeatureLock;			///< Order KMutexOrdPubSub
 
@@ -266,8 +284,20 @@
 	};
 
 
+// Completion/Cancelation DFCs and their corresponding queues.
+// All subscribe requests are completed in Supervisor thread.
 TDfc		TProperty::CompletionDfc(TProperty::CompleteDfc, &TProperty::CompletionQue, KCompletionDfcPriority);
 SDblQue		TProperty::CompletionQue;
+
+TDfc		TProperty::CompletionDfcPermissionDenied(TProperty::CompleteDfcByKErrPermissionDenied, &TProperty::CompletionQuePermissionDenied, KCompletionDfcPriority);
+SDblQue		TProperty::CompletionQuePermissionDenied;
+
+TDfc		TProperty::CompletionDfcNotFound(TProperty::CompleteDfcByKErrNotFound, &TProperty::CompletionQueNotFound, KCompletionDfcPriority);
+SDblQue		TProperty::CompletionQueNotFound;
+
+TDfc		TProperty::CancellationDfc(TProperty::CompleteCancellationQDfc, &TProperty::CancellationQue, KCancellationDfcPriority);
+SDblQue		TProperty::CancellationQue;
+
 DMutex*		TProperty::FeatureLock;	
 TProperty*	TProperty::Table[KHashTableLimit];
 
@@ -288,6 +318,9 @@
 	if (r != KErrNone)
 		return r;
 	CompletionDfc.SetDfcQ(K::SvMsgQ);
+	CompletionDfcPermissionDenied.SetDfcQ(K::SvMsgQ);
+	CompletionDfcNotFound.SetDfcQ(K::SvMsgQ);
+	CancellationDfc.SetDfcQ(K::SvMsgQ);
 	
 #ifdef __DEMAND_PAGING__	
 	r = Kern::MutexCreate(PagingLockMutex, KPubSubMutexName2, KMutexOrdPubSub2);
@@ -512,8 +545,9 @@
 	// iteration; we get (move) always the first 'iPendingQue' entry until the 
 	// queue becomes empty.
 	//
-	SDblQue localPendingQue;	// protected by the system lock
-	SDblQue localCompletionQue;	// protected by the system lock
+
+	SDblQue localPendingQue;    // Will hold requests with sufficient capabilities. 
+	TInt accessDeniedCounter = 0;// Will count requests with no sufficient capabilities.
 	NKern::LockSystem();
 	while (!iPendingQue.IsEmpty())
 		{
@@ -522,7 +556,8 @@
 		subs->iProcess = NULL;
 		if (process && !CheckGetRights(process, __PLATSEC_DIAGNOSTIC_STRING("Checked whilst trying to Subscribe to a Publish and Subscribe Property")))
 			{ // Check fails - will complete the subscription with an error
-			localCompletionQue.Add(subs);
+			CompletionQuePermissionDenied.Add(subs);
+			accessDeniedCounter++;
 			}
 		else
 			{ // Check OK - will leave in the pending queue 
@@ -536,8 +571,10 @@
 	// Now the property can be accessed by other threads.
 	Use();
 	Unlock();
-	// Now we can complete requests.
-	CompleteQue(&localCompletionQue, KErrPermissionDenied);
+
+	// Schedule DFC to complete requests of those with insufficient capabilities.
+	if (accessDeniedCounter)
+		CompletionDfcPermissionDenied.Enque();
 	return KErrNone;
 	}
 
@@ -604,9 +641,10 @@
 	SetNotDefined();
 	// Down from here nobody can access the property value
 
-	// We don't want to complete requests holding the feature lock. 
-	SDblQue localQue;
-	localQue.MoveFrom(&iPendingQue);
+	// Move all pending requests to completion queue (to be completed by KErrNotFound).
+	TBool pendingQueEmpty = iPendingQue.IsEmpty();
+	if(!pendingQueEmpty)
+		CompletionQueNotFound.MoveFrom(&iPendingQue);
 
 	NKern::UnlockSystem();
 
@@ -616,8 +654,10 @@
 	Release();
 	// '*this' may do not exist any more
 	Unlock();
-	 // Now we can complete.
-	CompleteQue(&localQue, KErrNotFound);
+
+	 // Schedule Svc Dfc to complete all requests from CompletionQueNotFound.
+	if (!pendingQueEmpty)
+		CompletionDfcNotFound.Enque();
 	return KErrNone;
 	}
 
@@ -661,9 +701,8 @@
 		aSubs->iProcess = NULL;	
 		if (aProcess && !CheckGetRights(aProcess,__PLATSEC_DIAGNOSTIC_STRING("Checked whilst trying to Subscribe to a Publish and Subscribe Property")))
 			{
-			NKern::ThreadEnterCS();
-			CompleteRequest(aSubs, KErrPermissionDenied);
-			NKern::ThreadLeaveCS();
+			CompletionQuePermissionDenied.Add(aSubs);
+			CompletionDfcPermissionDenied.Enque(SYSTEM_LOCK);
 			return KErrNone;
 			}
 		}	
@@ -681,36 +720,70 @@
 void TProperty::Cancel(TPropertySubsRequest* aSubs)
 	{
 	__ASSERT_SYSTEM_LOCK;
-	if (!aSubs->iNext)
-		{ // not pending - silently return
-		NKern::UnlockSystem();	
+
+	// This is set if the request is about to be completed (in SVC thread). In that case, a 'dummy' CancelationDFC
+	// will be scheduled here. This will just ensure that we don't return from Cancel before ongoing completion has finished.  
+	TBool scheduledForCompletition = (TInt)(aSubs->iProcess) & TPropertySubsRequest::KScheduledForCompletion;
+
+	if (!aSubs->iNext && !scheduledForCompletition)
+		{ // Neither in any queue nor scheduled for completion.
+		  // The request is not active - silently return.
+		NKern::UnlockSystem();
 		return;
 		}
-	aSubs->Deque();
-	aSubs->iNext = NULL;
-	aSubs->iProcess = NULL;
-	NKern::ThreadEnterCS();
-	CompleteRequest(aSubs, KErrCancel);
-	NKern::ThreadLeaveCS();
+
+	if (aSubs->iNext)
+		{
+		// Take it out from the current queue. It is usually pending queue of a property but could
+		// also be one of the completion queues.
+		aSubs->Deque();
+		aSubs->iNext = NULL;
+		}
+	
+	// Set process to NULL (leave KScheduledForCompletion bit as it is)
+	aSubs->iProcess = (DProcess*)((TInt)aSubs->iProcess & ~TPropertySubsRequest::KProcessPtrMask);
+	
+	if (&Kern::CurrentThread() == K::SvThread)
+		{   // Complete the request immediatelly if already running in supervisor thread...
+		if (!scheduledForCompletition)
+			CompleteRequest(aSubs, KErrCancel); //This will also release system lock.
+		else
+			NKern::UnlockSystem();              // Nothing to be done here. Just release system lock.
+		}
+	else
+		{   //... or schedule DFC in supervisor thread to complete the request.
+		TCancelQ linkQ;
+		if (!scheduledForCompletition)
+			linkQ.iPropSubRequest = aSubs;      // CancelationDFC will complete this request with KErrCancel.
+		else
+			linkQ.iPropSubRequest = NULL;       // Schedule 'dummy' CancelationDFC (no request will be completed).
+		linkQ.iFSemaphore.iOwningThread = NKern::CurrentThread();
+		CancellationQue.Add(&linkQ);
+		CancellationDfc.Enque(SYSTEM_LOCK);     // This will also release system lock.
+
+		NKern::FSWait(&linkQ.iFSemaphore);      // Wait for CancellationDfc to finish.
+		}
 	}
 
 // Enter system locked.
 // Return system unlocked.
-// Called in CS or a DFC context
+// Executed in supervisor thread.
 void TProperty::CompleteRequest(TPropertySubsRequest* aSubs, TInt aResult)
 	{ // static
 	__ASSERT_SYSTEM_LOCK;
-	__ASSERT_CRITICAL;
+	__PS_ASSERT(&Kern::CurrentThread() == K::SvThread);
 	TPropertyCompleteFn	fn = aSubs->iCompleteFn;
 	TAny* ptr = aSubs->iPtr;
+	// Mark that this request is about to be completed.
+	aSubs->iProcess = (DProcess*)((TInt)aSubs->iProcess | TPropertySubsRequest::KScheduledForCompletion);
 	NKern::UnlockSystem();
 	(*fn)(ptr, aResult);
 	}
 
-// Called in CS or a DFC context
+// Executed in supervisor thread.
 void TProperty::CompleteQue(SDblQue* aQue, TInt aReason)
 	{ // static
-	__ASSERT_CRITICAL;
+	__PS_ASSERT(&Kern::CurrentThread() == K::SvThread);
 	NKern::LockSystem();
 	while (!aQue->IsEmpty())
 		{ 
@@ -723,12 +796,53 @@
 	NKern::UnlockSystem();
 	}
 
-// Executed in DFC context
+// Executed in supervisor thread. Completes requests with KErrNone.
 void TProperty::CompleteDfc(TAny* aQue)
 	{ // static
 	CompleteQue((SDblQue*) aQue, KErrNone);
 	}
 
+// Executed in supervisor thread.
+void TProperty::CompleteDfcByKErrPermissionDenied(TAny* aQue)
+	{ // static
+	CompleteQue((SDblQue*) aQue, KErrPermissionDenied);
+	}
+
+// Executed in supervisor thread.
+void TProperty::CompleteDfcByKErrNotFound(TAny* aQue)
+	{ // static
+	CompleteQue((SDblQue*) aQue, KErrNotFound);
+	}
+
+// Executed in supervisor thread.
+void TProperty::CompleteCancellationQDfc(TAny* aAny)
+	{ // static
+	SDblQue* aQue = (SDblQue*)aAny;
+	NKern::LockSystem();
+	while (!aQue->IsEmpty() )
+		{
+        TCancelQ* first = static_cast<TCancelQ*>(aQue->First());
+        first->Deque();
+        first->iNext = NULL;
+
+        if( first->iPropSubRequest)
+        	{
+            CompleteRequest(first->iPropSubRequest, KErrCancel); // This will also release system lock.
+            NKern::LockSystem();
+        	}
+        else
+        	{
+        	// Do not complete the request.
+        	// It was already just about to be completed when Cancel request was issued.
+			// As all complitions (this method included) run is Svc thread, we can here be sure that
+			// the request is now completed.
+			NKern::FlashSystem();	// Preemption point
+        	}
+        NKern::FSSignal( &first->iFSemaphore ); // Issue the signal that the request is now completed.
+        }
+    NKern::UnlockSystem();
+	}
+
 // Enter system locked.
 // Return system unlocked.
 void TProperty::CompleteByDfc()
@@ -900,7 +1014,7 @@
 		return KErrArgument;
 		}
 	iValue = aValue;
-	CompleteByDfc();
+	CompleteByDfc(); //This will also release system lock.
 	return KErrNone;
 	}
 
--- a/kernel/eka/kernel/sthread.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/kernel/sthread.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -589,29 +589,28 @@
 	ni.iStackSize=iSupervisorStackSize;
 #ifdef __SMP__
 	TUint32 config = TheSuperPage().KernelConfigFlags();
+	ni.iGroup = 0;
+	ni.iCpuAffinity = KCpuAffinityAny;
 	if (iThreadType==EThreadUser)
 		{
 		// user thread
 		if ((config & EKernelConfigSMPUnsafeCPU0) && iOwningProcess->iSMPUnsafeCount)
 			{
 			ni.iCpuAffinity = 0; // compatibility mode
-			ni.iGroup = 0;
 			}
 		else
 			{
-			ni.iCpuAffinity = KCpuAffinityAny;
 			if ((config & EKernelConfigSMPUnsafeCompat) && iOwningProcess->iSMPUnsafeCount)
 				ni.iGroup = iOwningProcess->iSMPUnsafeGroup;
-			else
-				ni.iGroup = 0;
 			}
-		
 		}
 	else
 		{
-		// kernel thread
-		ni.iCpuAffinity = 0;
-		ni.iGroup = 0;
+		if (config & EKernelConfigSMPLockKernelThreadsCore0) 
+			{
+			// kernel thread
+			ni.iCpuAffinity = 0;
+			}
 		}
 #endif
 	if (iThreadType!=EThreadInitial)
--- a/kernel/eka/klib/arm/cbma.cia	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/klib/arm/cbma.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -336,6 +336,81 @@
 	}
 
 
+/**	Allocates a specific range of bit positions.
+	
+	The specified range must lie within the total range for this allocator but it is
+	not necessary that all the positions are currently free.
+
+	@param	aStart	First position to allocate.
+	@param	aLength	Number of consecutive positions to allocate, must be >0.
+	@return The number of previously free positions that were allocated.
+ */
+EXPORT_C __NAKED__ TUint TBitMapAllocator::SelectiveAlloc(TInt /*aStart*/, TInt /*aLength*/)
+	{
+	asm("ldr r3, [r0, #%a0] " : : "i" _FOFF(TBitMapAllocator, iSize));	// r3->iSize
+	asm("stmfd sp!, {r4-r8,lr} ");
+	asm("adds r4, r1, r2 ");			// r4 = aStart + aLength
+	asm("bcs 0f ");						// if (aStart + aLength < aStart)
+	asm("cmp r4, r3 ");					// if (aStart + aLength > iSize)
+	asm("bhi 0f ");
+	asm("mov r7, r0 ");					// r7 = this
+	asm("mov r4, r1, lsr #5 ");			// r4 = wix = aStart >> 5
+	asm("and r1, r1, #0x1f ");			// r1 = sbit = aStart & 31
+	asm("ldr r6, [r7, #%a0] " : : "i" _FOFF(TBitMapAllocator, iAvail));	// r6 = iAvail
+	asm("add r4, r7, r4, lsl #2 ");	
+	asm("add r4, r4, #%a0 " : : "i" _FOFF(TBitMapAllocator, iMap));		// r4 = iMap + wix
+	asm("sub r6, r6, r2 ");				// r6 = iAvail -= aLength
+	asm("add r5, r2, r1 ");				// r5 = ebit =  sbit + aLength
+	asm("mvn r0, #0 ");
+	asm("mvn r0, r0, lsr r1 ");			// r0 = b = ~(0xffffffff >> sbit)
+	asm("cmp r5, #32 ");
+	asm("mov r8, r2");					// r8 = aLength
+	asm("bhi salloc_cross_bdry ");		// branch if (ebit >=32)
+
+	asm("mvn r5, #0 ");					// r5 = 0xffffffff
+	asm("mov r5, r5, lsr r8 ");			// r5 >> aLength
+	asm("mov r5, r5, lsr r1 ");			// r5 >> sbit
+	asm("orr r5, r5, r0 ");				// r5 = b = r0 | r5
+	asm("ldr r0, [r4] ");				// r0 = w = *pW
+	asm("and r1, r0, r5 ");				// r1 = w & b, clear the positions to be allocated
+	asm("str r1, [r4] ");				// *pW = r1, store new bit map word.
+	asm("mvn r0, r0");					// r0 = ~w
+	asm("mvn r5, r5");					// r5 = ~b
+	asm("and r0, r0, r5");				// r0 = ~w & ~b
+	asm("bl " CSM_CFUNC(__e32_bit_count_32));
+	asm("add r6, r6, r0 ");				// r6 = iAvail + allocated
+	asm("sub r0, r8, r0 ");				// return aLength - allocated
+	asm("str r6, [r7] ");				// iAvail += allocated, store free count
+	asm("ldmfd sp!, {r4-r8,pc} ");		// return
+	
+	asm("salloc_cross_bdry: ");			// r0 = b, r8 = aLength, r7 = this, r5 = ebit
+	asm("ldr r2, [r4] ");				// r2 = w = *pW
+	asm("and r1, r2, r0 ");				// r1 = w & b
+	asm("str r1, [r4], #4 ");			// *pW++ = r1, store new bit mask
+	asm("mvn r2, r2");					// r2 = ~w
+	asm("mvn r0, r0");					// r0 = ~b
+	asm("and r0, r0, r2");				// r0 = ~w & ~b
+	asm("bl " CSM_CFUNC(__e32_bit_count_32));
+	asm("add r6, r6, r0 ");				// r6 = iAvail += allocated
+	asm("sub r8, r8, r0 ");				// r8 = aLength -= allocated
+	asm("subs r5, r5, #32 ");			// r5 = ebit -= 32
+	asm("bls salloc_return ");			// ebit < 0 so return.
+	asm("cmp r5, #32 ");				// if (ebit < 32) {
+	asm("mvnlt r0, #0 ");
+	asm("movlt r0, r0, lsr r5 ");		// r0 = 0xffffffff >> ebit }
+	asm("movge r0, #0 ");				// if (ebit >= 32) r0 = b = 0
+	asm("b salloc_cross_bdry ");
+
+	asm("salloc_return: ");
+	asm("str r6, [r7] ");				// iAvail += allocated, store free count
+	asm("mov r0, r8 ");					// return aLength
+	asm("ldmfd sp!, {r4-r8,pc} ");		// return
+
+	asm("0: ");
+	ASM_FAULT();
+	}
+
+
 /**	Tests if a specific range of bit positions are all free
 	Specified range must lie within the total range for this allocator.
 
--- a/kernel/eka/klib/bma.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/klib/bma.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -433,6 +433,49 @@
 	}
 
 
+/**	Allocates a specific range of bit positions.
+	
+	The specified range must lie within the total range for this allocator but it is
+	not necessary that all the positions are currently free.
+
+	@param	aStart	First position to allocate.
+	@param	aLength	Number of consecutive positions to allocate, must be >0.
+	@return The number of previously free positions that were allocated.
+ */
+EXPORT_C TUint TBitMapAllocator::SelectiveAlloc(TInt aStart, TInt aLength)
+	{
+	__ASSERT_ALWAYS(TUint(aStart) < TUint(iSize), TBMA_FAULT());
+	__ASSERT_ALWAYS(TUint(aStart + aLength) >= TUint(aStart), TBMA_FAULT());
+	__ASSERT_ALWAYS(TUint(aStart + aLength) <= TUint(iSize), TBMA_FAULT());
+	TInt wix = aStart >> 5;
+	TInt sbit = aStart & 31;
+	TUint32* pW = iMap + wix;
+	iAvail -= aLength;	// update free count assuming no positions already allocated
+	TInt ebit = sbit + aLength;
+	if (ebit < 32)
+		{
+		TUint32 b = ((0xffffffffu >> aLength) >> sbit) | ~(0xffffffffu >> sbit);
+		TUint32 w = *pW;
+		*pW = w & b;	// mark all positions allocated
+		TUint allocated = __e32_bit_count_32(~w & ~b);
+		iAvail += allocated;	// increase free count by number of positions already allocated
+		return aLength - allocated;
+		}
+	TUint32 b = ~(0xffffffffu >> sbit);
+	while (ebit > 0)
+		{
+		TUint32 w = *pW;
+		*pW++ = w & b;		// mark all positions allocated
+		TUint allocated = __e32_bit_count_32(~w & ~b);
+		iAvail += allocated;	// increase free count by number of positions already allocated
+		aLength -= allocated;
+		ebit -= 32;
+		b = (ebit >= 32)? 0 : 0xffffffff >> ebit;
+		}
+	return aLength;
+	}
+
+
 /**	Tests whether a specific range of bit positions are all free.
 
 	The specified range must lie within the total range for this allocator.
@@ -762,49 +805,6 @@
 	}
 
 
-/**	Allocates a specific range of bit positions.
-	
-	The specified range must lie within the total range for this allocator but it is
-	not necessary that all the positions are currently free.
-
-	@param	aStart	First position to allocate.
-	@param	aLength	Number of consecutive positions to allocate, must be >0.
-	@return The number of previously free positions that were allocated.
- */
-EXPORT_C TUint TBitMapAllocator::SelectiveAlloc(TInt aStart, TInt aLength)
-	{
-	__ASSERT_ALWAYS(TUint(aStart) < TUint(iSize), TBMA_FAULT());
-	__ASSERT_ALWAYS(TUint(aStart + aLength) >= TUint(aStart), TBMA_FAULT());
-	__ASSERT_ALWAYS(TUint(aStart + aLength) <= TUint(iSize), TBMA_FAULT());
-	TInt wix = aStart >> 5;
-	TInt sbit = aStart & 31;
-	TUint32* pW = iMap + wix;
-	iAvail -= aLength;	// update free count assuming no positions already allocated
-	TInt ebit = sbit + aLength;
-	if (ebit < 32)
-		{
-		TUint32 b = ((0xffffffffu >> aLength) >> sbit) | ~(0xffffffffu >> sbit);
-		TUint32 w = *pW;
-		*pW = w & b;	// mark all positions allocated
-		TUint allocated = __e32_bit_count_32(~w & ~b);
-		iAvail += allocated;	// increase free count by number of positions already allocated
-		return aLength - allocated;
-		}
-	TUint32 b = ~(0xffffffffu >> sbit);
-	while (ebit > 0)
-		{
-		TUint32 w = *pW;
-		*pW++ = w & b;		// mark all positions allocated
-		TUint allocated = __e32_bit_count_32(~w & ~b);
-		iAvail += allocated;	// increase free count by number of positions already allocated
-		aLength -= allocated;
-		ebit -= 32;
-		b = (ebit >= 32)? 0 : 0xffffffff >> ebit;
-		}
-	return aLength;
-	}
-
-
 /** Copies a range from another allocator, mark remainder as occupied.
 
 	Values of bit positions from aFirst to aFirst+aLen-1 inclusive in allocator
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mcodepaging.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mcodepaging.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -290,7 +290,7 @@
 			__KTRACE_OPT(KPAGING,Kern::Printf("  uncompressed, file offset == %x, size == %d", dataOffset, dataSize));
 			}
 
-		TInt bufferStart = info.iBlockMap.Read(aRequest->iBuffer,
+		TInt bufferStart = info.iBlockMap.Read(aRequest->Buffer(),
 												dataOffset,
 												dataSize,
 												device.iReadUnitShift,
@@ -305,7 +305,7 @@
 			break;
 			}
 
-		TLinAddr data = aRequest->iBuffer + bufferStart;
+		TLinAddr data = aRequest->Buffer() + bufferStart;
 		r = Decompress(info.iCompressionType, linAddr, decompressedSize, data, dataSize);
 		if(r>=0)
 			{
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mdatapaging.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mdatapaging.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -14,6 +14,7 @@
 //
 
 #include <plat_priv.h>
+#include <kernel/cache.h>
 #include "mm.h"
 #include "mmu.h"
 
@@ -25,6 +26,34 @@
 
 
 /**
+Log2 of minimum number of pages to attempt to write at a time.
+
+The value of 2 gives a minimum write size of 16KB.
+*/
+const TUint KMinPreferredWriteShift = 2;
+
+/**
+Log2 of maximum number of pages to attempt to write at a time.
+
+The value of 4 gives a maximum write size of 64KB.
+*/
+const TUint KMaxPreferredWriteShift = 4;
+
+__ASSERT_COMPILE((1 << KMaxPreferredWriteShift) <= KMaxPagesToClean);
+
+
+/**
+Whether the CPU has the page colouring restriction, where pages must be mapped in sequential colour
+order.
+*/
+#ifdef __CPU_CACHE_HAS_COLOUR	
+const TBool KPageColouringRestriction = ETrue;
+#else
+const TBool KPageColouringRestriction = EFalse;
+#endif
+
+
+/**
 Manages the swap via the data paging device.
 */
 class DSwapManager
@@ -57,23 +86,24 @@
 	TInt UnreserveSwap(DMemoryObject* aMemory, TUint aStartIndex, TUint aPageCount);
 	TBool IsReserved(DMemoryObject* aMemory, TUint aStartIndex, TUint aPageCount);
 
-	TInt ReadSwapPages(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TLinAddr aLinAddr, DPageReadRequest* aRequest, TPhysAddr* aPhysAddrs);
-	TInt WriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TBool aBackground);
+	TInt ReadSwapPages(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TLinAddr aLinAddr, TPhysAddr* aPhysAddrs);
+	TInt WriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TPhysAddr* aPhysAddrs, TBool aBackground);
 
 	void GetSwapInfo(SVMSwapInfo& aInfoOut);
 	TInt SetSwapThresholds(const SVMSwapThresholds& aThresholds);
+	void SetSwapAlign(TUint aSwapAlign);
 
 private:
 	inline TSwapState SwapState(TUint aSwapData);
 	inline TInt SwapIndex(TUint aSwapData);
 	inline TUint SwapData(TSwapState aSwapState, TInt aSwapIndex);
 	
-	TInt AllocSwapIndex(TInt aCount);
+	TInt AllocSwapIndex(TUint aCount);
 	void FreeSwapIndex(TInt aSwapIndex);
 	void CheckSwapThresholdsAndUnlock(TUint aInitial);
 	
 	void DoDeleteNotify(TUint aSwapIndex);
-	TInt DoWriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TInt aSwapIndex, TBool aBackground);
+	TInt DoWriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TInt aPageIndex, TPhysAddr* aPhysAddrs, TInt aSwapIndex, TBool aBackground);
 	
 private:
 	DPagingDevice* iDevice;			///< Paging device used to read and write swap pages
@@ -81,6 +111,7 @@
 	NFastMutex iSwapLock;			///< Fast mutex protecting access to all members below
 	TUint iFreePageCount;			///< Number of swap pages that have not been reserved
 	TBitMapAllocator* iBitMap;		///< Bitmap of swap pages that have been allocated
+	TUint iSwapAlign;				///< Log2 number of pages to align swap writes to
 	TUint iAllocOffset;				///< Next offset to try when allocating a swap page
  	TUint iSwapThesholdLow;
  	TUint iSwapThesholdGood;
@@ -88,11 +119,11 @@
 
 
 /**
-Manager for demand paged memory objects which contain writeable data.
-The contents of the memory are written to a backing store whenever its
-pages are 'paged out'.
+   Manager for demand paged memory objects which contain writeable data.
+   The contents of the memory are written to a backing store whenever its
+   pages are 'paged out'.
 
-@see DSwapManager
+   @see DSwapManager
 */
 class DDataPagedMemoryManager : public DPagedMemoryManager
 	{
@@ -114,6 +145,12 @@
 public:
 	void GetSwapInfo(SVMSwapInfo& aInfoOut);
 	TInt SetSwapThresholds(const SVMSwapThresholds& aThresholds);
+	TBool PhysicalAccessSupported();
+	TBool UsePhysicalAccess();
+	void SetUsePhysicalAccess(TBool aUsePhysicalAccess);
+	TUint PreferredWriteSize();
+	TUint PreferredSwapAlignment();
+	TInt SetWriteSize(TUint aWriteShift);
 
 private:
 	TInt WritePages(DMemoryObject** aMemory, TUint* aIndex, TPhysAddr* aPages, TUint aCount, DPageWriteRequest *aRequest, TBool aAnyExecutable, TBool aBackground);
@@ -130,6 +167,13 @@
 	*/
 	DSwapManager* iSwapManager;
 
+	/**
+	Whether to read and write pages by physical address without mapping them first.
+
+	Set if the paging media driver supports it.
+	*/
+	TBool iUsePhysicalAccess;
+
 public:
 	/**
 	The single instance of this manager class.
@@ -175,6 +219,15 @@
 	}
 
 
+void DSwapManager::SetSwapAlign(TUint aSwapAlign)
+	{
+	TRACE(("WDP: Set swap alignment to %d (%d KB)", aSwapAlign, 4 << aSwapAlign));
+	NKern::FMWait(&iSwapLock);
+	iSwapAlign = aSwapAlign;
+	NKern::FMSignal(&iSwapLock);
+	}
+
+
 inline DSwapManager::TSwapState DSwapManager::SwapState(TUint aSwapData)
 	{
 	TSwapState state = (TSwapState)(aSwapData & ESwapStateMask);
@@ -204,34 +257,57 @@
 
 @return The swap index of the first location allocated.
 */
-TInt DSwapManager::AllocSwapIndex(TInt aCount)
+TInt DSwapManager::AllocSwapIndex(TUint aCount)
 	{
-	__NK_ASSERT_DEBUG(aCount > 0 && aCount <= KMaxPagesToClean);
+	TRACE2(("DSwapManager::AllocSwapIndex %d", aCount));
+		
+	__NK_ASSERT_DEBUG(aCount <= KMaxPagesToClean);
 	NKern::FMWait(&iSwapLock);
 
-	// search for run of aCount from iAllocOffset to end
-	TInt carry = 0;
+	TInt carry;
 	TInt l = KMaxTInt;
-	TInt swapIndex = iBitMap->AllocAligned(aCount, 0, 0, EFalse, carry, l, iAllocOffset);
+	TInt swapIndex = -1;
 
-	// if search failed, retry from beginning
+	// if size suitable for alignment, search for aligned run of aCount from iAllocOffset to end,
+	// then from beginning
+	// 
+	// note that this aligns writes that at least as large as the alignment size - an alternative
+	// policy might be to align writes that are an exact multiple of the alignment size
+	if (iSwapAlign && aCount >= (1u << iSwapAlign))
+		{
+		carry = 0;
+		swapIndex = iBitMap->AllocAligned(aCount, iSwapAlign, 0, EFalse, carry, l, iAllocOffset);
+		if (swapIndex < 0)
+			{
+			carry = 0;
+			swapIndex = iBitMap->AllocAligned(aCount, iSwapAlign, 0, EFalse, carry, l, 0);
+			}
+		}
+	
+	// if not doing aligned search, or aligned search failed, retry without alignment
 	if (swapIndex < 0)
 		{
-		iAllocOffset = 0;
 		carry = 0;
 		swapIndex = iBitMap->AllocAligned(aCount, 0, 0, EFalse, carry, l, iAllocOffset);
+		if (swapIndex < 0)
+			{
+			carry = 0;
+			swapIndex = iBitMap->AllocAligned(aCount, 0, 0, EFalse, carry, l, 0);
+			}
 		}
 
 	// if we found one then mark it as allocated and update iAllocOffset
 	if (swapIndex >= 0)
 		{
-		__NK_ASSERT_DEBUG(swapIndex <= (iBitMap->iSize - aCount));
+		__NK_ASSERT_DEBUG(swapIndex <= (TInt)(iBitMap->iSize - aCount));
 		iBitMap->Alloc(swapIndex, aCount);
 		iAllocOffset = (swapIndex + aCount) % iBitMap->iSize;
 		}
 	
 	NKern::FMSignal(&iSwapLock);
 	__NK_ASSERT_DEBUG(swapIndex >= 0 || aCount > 1); // can't fail to allocate single page
+
+	TRACE2(("DSwapManager::AllocSwapIndex returns %d", swapIndex));	
 	return swapIndex;
 	}
 
@@ -384,7 +460,7 @@
 @param aRequest	The request to use for the read.
 @param aPhysAddrs	An array of the physical addresses for each page to read in.
 */
-TInt DSwapManager::ReadSwapPages(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TLinAddr aLinAddr, DPageReadRequest* aRequest, TPhysAddr* aPhysAddrs)
+TInt DSwapManager::ReadSwapPages(DMemoryObject* aMemory, TUint aIndex, TUint aCount, TLinAddr aLinAddr, TPhysAddr* aPhysAddrs)
 	{
 	__ASSERT_CRITICAL;
 	
@@ -458,8 +534,10 @@
 
 @pre Called with page cleaning lock held
 */
-TInt DSwapManager::WriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TBool aBackground)
+TInt DSwapManager::WriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TPhysAddr* aPhysAddrs, TBool aBackground)
 	{
+	TRACE(("DSwapManager::WriteSwapPages %d pages", aCount));
+	
 	__ASSERT_CRITICAL;  // so we can pass the paging device a stack-allocated TThreadMessage
 	__NK_ASSERT_DEBUG(PageCleaningLock::IsHeld());
 
@@ -503,13 +581,13 @@
 			if (startIndex != -1)
 				{
 				// write pages from startIndex to i exclusive
-				TInt count = i - startIndex;
+				TUint count = i - startIndex;
 				__NK_ASSERT_DEBUG(count > 0 && count <= KMaxPagesToClean);
 
 				// Get a new swap location for these pages, writing them all together if possible
 				TInt swapIndex = AllocSwapIndex(count);
 				if (swapIndex >= 0)
-					r = DoWriteSwapPages(&aMemory[startIndex], &aIndex[startIndex], count, aLinAddr + (startIndex << KPageShift), swapIndex, aBackground);
+					r = DoWriteSwapPages(&aMemory[startIndex], &aIndex[startIndex], count, aLinAddr, startIndex, aPhysAddrs, swapIndex, aBackground);
 				else
 					{
 					// Otherwise, write them individually
@@ -517,7 +595,7 @@
 						{
 						swapIndex = AllocSwapIndex(1);
 						__NK_ASSERT_DEBUG(swapIndex >= 0);
-						r = DoWriteSwapPages(&aMemory[j], &aIndex[j], 1, aLinAddr + (j << KPageShift), swapIndex, aBackground);
+						r = DoWriteSwapPages(&aMemory[j], &aIndex[j], 1, aLinAddr, j, &aPhysAddrs[j], swapIndex, aBackground);
 						if (r != KErrNone)
 							break;
 						}
@@ -533,16 +611,22 @@
 	return r;
 	}
 
-TInt DSwapManager::DoWriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TInt aSwapIndex, TBool aBackground)
+TInt DSwapManager::DoWriteSwapPages(DMemoryObject** aMemory, TUint* aIndex, TUint aCount, TLinAddr aLinAddr, TInt aPageIndex, TPhysAddr* aPhysAddrs, TInt aSwapIndex, TBool aBackground)
 	{	
+	TRACE2(("DSwapManager::DoWriteSwapPages %d pages to %d", aCount, aSwapIndex));
 		
 	const TUint readUnitShift = iDevice->iReadUnitShift;
 	const TUint writeSize = aCount << (KPageShift - readUnitShift);
 	const TUint writeOffset = aSwapIndex << (KPageShift - readUnitShift);
-		
+
 	TThreadMessage msg;
 	START_PAGING_BENCHMARK;
-	TInt r = iDevice->Write(&msg, aLinAddr, writeOffset, writeSize, aBackground);
+	TInt r;
+	if (aLinAddr == 0)
+		r = iDevice->WritePhysical(&msg, aPhysAddrs, aCount, writeOffset, aBackground);
+	else
+		r = iDevice->Write(&msg, aLinAddr + (aPageIndex << KPageShift), writeOffset, writeSize, aBackground);
+		
 	if (r != KErrNone)
 		{
 		__KTRACE_OPT(KPANIC, Kern::Printf("DSwapManager::WriteSwapPages: error writing media from %08x to %08x + %x: %d", aLinAddr, writeOffset << readUnitShift, writeSize << readUnitShift, r));
@@ -643,6 +727,63 @@
 	}
 
 
+TBool DDataPagedMemoryManager::PhysicalAccessSupported()
+	{
+	return (iDevice->iFlags & DPagingDevice::ESupportsPhysicalAccess) != 0;
+	}
+
+
+TBool DDataPagedMemoryManager::UsePhysicalAccess()
+	{
+	return iUsePhysicalAccess;
+	}
+
+
+void DDataPagedMemoryManager::SetUsePhysicalAccess(TBool aUsePhysicalAccess)
+	{
+	TRACE(("WDP: Use physical access set to %d", aUsePhysicalAccess));
+	NKern::ThreadEnterCS();
+	PageCleaningLock::Lock();
+	iUsePhysicalAccess = aUsePhysicalAccess;
+	ThePager.SetCleanInSequence(!iUsePhysicalAccess && KPageColouringRestriction);
+	PageCleaningLock::Unlock();
+	NKern::ThreadLeaveCS();
+	}
+
+
+TUint DDataPagedMemoryManager::PreferredWriteSize()
+	{
+	return MaxU(iDevice->iPreferredWriteShift, KMinPreferredWriteShift + KPageShift) - KPageShift;
+	}
+
+
+TUint DDataPagedMemoryManager::PreferredSwapAlignment()
+	{
+	return MaxU(iDevice->iPreferredWriteShift, KPageShift) - KPageShift;
+	}
+
+
+TInt DDataPagedMemoryManager::SetWriteSize(TUint aWriteShift)
+	{
+	TRACE(("WDP: Set write size to %d (%d KB)", aWriteShift, 4 << aWriteShift));
+	// Check value is sensible
+	if (aWriteShift > 31)
+		return KErrArgument;
+	if (aWriteShift > KMaxPreferredWriteShift)
+		{
+		aWriteShift = KMaxPreferredWriteShift;
+		TRACE(("WDP: Reduced write size to %d (%d KB)",
+			   aWriteShift, 4 << aWriteShift));
+
+		}
+	NKern::ThreadEnterCS();
+	PageCleaningLock::Lock();
+	ThePager.SetPagesToClean(1 << aWriteShift);
+	PageCleaningLock::Unlock();
+	NKern::ThreadLeaveCS();
+	return KErrNone;
+	}
+
 
 TInt DDataPagedMemoryManager::InstallPagingDevice(DPagingDevice* aDevice)
 	{
@@ -673,9 +814,11 @@
 
 	// Now we can determine the size of the swap, create the swap manager.
 	iSwapManager = new DSwapManager;
-	__NK_ASSERT_ALWAYS(iSwapManager);
+	if (!iSwapManager)
+		return KErrNoMemory;
 
-	TInt r = iSwapManager->Create(iDevice);
+	// Create swap manager object
+	TInt r = iSwapManager->Create(aDevice);
 	if (r != KErrNone)
 		{// Couldn't create the swap manager.
 		delete iSwapManager;
@@ -683,6 +826,25 @@
 		NKern::SafeSwap(NULL, (TAny*&)iDevice);
 		return r;
 		}
+
+	// Enable physical access where supported
+	SetUsePhysicalAccess(PhysicalAccessSupported());
+	
+	// Determine swap alignment and number of pages to clean at once from device's preferred write
+	// size, if set
+	TRACE(("WDP: Preferred write shift is %d", iDevice->iPreferredWriteShift));
+	r = SetWriteSize(PreferredWriteSize());
+	if (r != KErrNone)
+		{
+		delete iSwapManager;
+		iSwapManager = NULL;
+		NKern::SafeSwap(NULL, (TAny*&)iDevice);
+		return r;
+		}
+
+	// Set swap alignment
+	iSwapManager->SetSwapAlign(PreferredSwapAlignment());
+	
  	NKern::LockedSetClear(K::MemModelAttributes, 0, EMemModelAttrDataPaging);
 
 	return r;
@@ -755,10 +917,15 @@
 	{
 	__NK_ASSERT_DEBUG(aRequest->CheckUseContiguous(aMemory,aIndex,aCount));
 
+	// todo: Possible to read using physical addresses here, but not sure it's worth it because it's
+	// not much saving and we may need to map the page anyway if it's blank to clear it
+	// 
+	// todo: Could move clearing pages up to here maybe?
+
 	// Map pages temporarily so that we can copy into them.
 	const TLinAddr linAddr = aRequest->MapPages(aIndex, aCount, aPages);
 
-	TInt r = iSwapManager->ReadSwapPages(aMemory, aIndex, aCount, linAddr, aRequest, aPages);
+	TInt r = iSwapManager->ReadSwapPages(aMemory, aIndex, aCount, linAddr, aPages);
 
 	// The memory object allows executable mappings then need IMB.
 	aRequest->UnmapPages(aMemory->IsExecutable());
@@ -769,13 +936,28 @@
 
 TInt DDataPagedMemoryManager::WritePages(DMemoryObject** aMemory, TUint* aIndex, TPhysAddr* aPages, TUint aCount, DPageWriteRequest* aRequest, TBool aAnyExecutable, TBool aBackground)
 	{
-	// Map pages temporarily so that we can copy into them.
-	const TLinAddr linAddr = aRequest->MapPages(aIndex[0], aCount, aPages);
+	// Note: this method used to do an IMB for executable pages (like ReadPages) but it was thought
+	// that this was uncessessary and so was removed
+
+	TLinAddr linAddr = 0;
 
-	TInt r = iSwapManager->WriteSwapPages(aMemory, aIndex, aCount, linAddr, aBackground);
+	if (iUsePhysicalAccess)
+		{
+		// must maps pages to perform cache maintenance but can map each page individually
+		for (TUint i = 0 ; i < aCount ; ++i)
+			{
+			TLinAddr addr = aRequest->MapPages(aIndex[i], 1, &aPages[i]);
+			Cache::SyncMemoryBeforeDmaWrite(addr, KPageSize);
+			aRequest->UnmapPages(EFalse);
+			}
+		}
+	else
+		linAddr = aRequest->MapPages(aIndex[0], aCount, aPages);
+	
+	TInt r = iSwapManager->WriteSwapPages(aMemory, aIndex, aCount, linAddr, aPages, aBackground);
 
-	// The memory object allows executable mappings then need IMB.
-	aRequest->UnmapPages(aAnyExecutable);
+	if (linAddr != 0)
+		aRequest->UnmapPages(EFalse);
 
 	return r;
 	}
@@ -783,6 +965,8 @@
 
 void DDataPagedMemoryManager::CleanPages(TUint aPageCount, SPageInfo** aPageInfos, TBool aBackground)
 	{
+	TRACE(("DDataPagedMemoryManager::CleanPages %d", aPageCount));
+	
 	__NK_ASSERT_DEBUG(PageCleaningLock::IsHeld());
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 	__NK_ASSERT_DEBUG(aPageCount <= (TUint)KMaxPagesToClean);
@@ -792,7 +976,7 @@
 	TUint index[KMaxPagesToClean];
 	TPhysAddr physAddr[KMaxPagesToClean];
 	TBool anyExecutable = EFalse;
-	
+
 	for (i = 0 ; i < aPageCount ; ++i)
 		{
 		SPageInfo* pi = aPageInfos[i];
@@ -828,7 +1012,8 @@
 		{
 		SPageInfo* pi = aPageInfos[i];
 		// check if page is clean...
-		if(pi->CheckModified(&memory[0]) || pi->IsWritable())
+		if(pi->CheckModified(&memory[0]) ||
+		   pi->IsWritable())
 			{
 			// someone else modified the page, or it became writable, so mark as not cleaned
 			aPageInfos[i] = NULL;
@@ -875,4 +1060,34 @@
 	{
 	return ((DDataPagedMemoryManager*)TheDataPagedMemoryManager)->SetSwapThresholds(aThresholds);
 	}
-  
+
+
+TBool GetPhysicalAccessSupported()
+	{
+	return ((DDataPagedMemoryManager*)TheDataPagedMemoryManager)->PhysicalAccessSupported();
+	}
+
+
+TBool GetUsePhysicalAccess()
+	{
+	return ((DDataPagedMemoryManager*)TheDataPagedMemoryManager)->UsePhysicalAccess();
+	}
+
+
+void SetUsePhysicalAccess(TBool aUsePhysicalAccess)
+	{
+	((DDataPagedMemoryManager*)TheDataPagedMemoryManager)->SetUsePhysicalAccess(aUsePhysicalAccess);
+	}
+
+
+TUint GetPreferredDataWriteSize()
+	{
+	return ((DDataPagedMemoryManager*)TheDataPagedMemoryManager)->PreferredWriteSize();
+	}
+
+
+TInt SetDataWriteSize(TUint aWriteShift)
+	{
+	return	((DDataPagedMemoryManager*)TheDataPagedMemoryManager)->SetWriteSize(aWriteShift);
+	}
+
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -115,14 +115,14 @@
 	RamAllocLock::Lock();
 
 	// Move the page to any RAM zone.
-	r = M::MovePage(aOld, aNew, KRamZoneInvalidId, EFalse);
+	r = M::MovePage(aOld, aNew, KRamZoneInvalidId, 0);
 
 	RamAllocLock::Unlock();
 	return r;
 	}
 
 
-TInt M::MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest)
+TInt M::MovePage(TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TUint aMoveDisFlags)
 	{
 	// Returns this when page is not paged or managed or free but is a real RAM page.
 	TInt r = KErrNotSupported;
@@ -130,26 +130,22 @@
 	// get memory object corresponding to the page...
 	DMemoryObject* memory = 0;
 	MmuLock::Lock();
-	SPageInfo* pi = SPageInfo::SafeFromPhysAddr(aOld&~KPageMask);
-	if(pi)
+	SPageInfo* pi = SPageInfo::SafeFromPhysAddr(aOld & ~KPageMask);
+	if (pi)
 		{
 		if (pi->PagedState() != SPageInfo::EUnpaged)
 			{// The page is paged so let the pager handle it.
-			return ThePager.DiscardPage(pi, aBlockZoneId, aBlockRest);
+			return ThePager.DiscardPage(pi, aBlockZoneId, aMoveDisFlags);
 			}
 		switch (pi->Type())
 			{
 			case SPageInfo::EManaged:
 				memory = pi->Owner();
-				// Note, whilst we hold the RamAllocLock the page can't change it's use
-				// and we can safely assume that it still belongs to the memory object
-				// at a fixed page index.
-				// Also, as memory objects can't be destroyed whilst they still own pages
-				// we can safely access this object without taking an explicit reference,
-				// i.e. we don't need to Open() the memory object.
-				MmuLock::Unlock();
-				// move page...
-				r = memory->iManager->MovePage(memory, pi, aNew, aBlockZoneId, aBlockRest);
+				memory->Open();
+				// move page, this will release the mmu lock.
+				r = memory->iManager->MovePage(	memory, pi, aNew, aBlockZoneId, 
+												(aMoveDisFlags & M::EMoveDisBlockRest)!=0);
+				memory->AsyncClose();
 				break;
 			case SPageInfo::EUnused:
 				r = KErrNotFound;	// This page is free so nothing to do.
@@ -186,15 +182,10 @@
 			{
 			case SPageInfo::EManaged:
 				memory = pi->Owner();
-				// Note, whilst we hold the RamAllocLock the page can't change it's use
-				// and we can safely assume that it still belongs to the memory object
-				// at a fixed page index.
-				// Also, as memory objects can't be destroyed whilst they still own pages
-				// we can safely access this object without taking an explicit referernce,
-				// i.e. we don't need to Open() the memory object.
-				MmuLock::Unlock();
-				// move page...
+				memory->Open();
+				// move page, this will release the mmu lock.
 				r = memory->iManager->MoveAndAllocPage(memory, pi, aPageType);
+				memory->AsyncClose();
 				break;
 			case SPageInfo::EUnused:
 				r = KErrNone;	// This page is free so nothing to do.
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.inl	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mdefrag.inl	Tue Jul 06 15:50:07 2010 +0300
@@ -50,10 +50,10 @@
 	}
 
 
-inline TInt M::DiscardPage(TPhysAddr aAddr, TUint aBlockZoneId, TBool aBlockRest)
+inline TInt M::DiscardPage(TPhysAddr aAddr, TUint aBlockZoneId, TUint aMoveDisFlags)
 	{
 	TPhysAddr newAddr;
-	return MovePage(aAddr, newAddr, aBlockZoneId, aBlockRest);
+	return MovePage(aAddr, newAddr, aBlockZoneId, aMoveDisFlags);
 	}
 
 
@@ -75,3 +75,9 @@
 								aZone->iPhysPages,
 								(Mmu::TRamAllocFlags)EMemAttStronglyOrdered);
 	}
+
+
+inline TBool M::GetFreePages(TUint aNumPages)
+	{
+	return ThePager.GetFreePages(aNumPages);
+	}
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mm.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mm.h	Tue Jul 06 15:50:07 2010 +0300
@@ -1124,6 +1124,14 @@
 FORCE_INLINE void FlagClear(T& a,const T b,const T c,const T d)
 	{ a = (T)(a&~b&~c&~d); }
 
+/// Utility function to calculate the minimum of two unsigned integers
+FORCE_INLINE TUint MinU(TUint a, TUint b)
+	{ return a <= b ? a : b; }
+
+/// Utility function to calculate the maximum of two unsigned integers
+FORCE_INLINE TUint MaxU(TUint a, TUint b)
+	{ return a >= b ? a : b; }
+
 
 #include <memmodel/epoc/mmubase/kblockmap.h>
 
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmanager.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmanager.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -131,12 +131,14 @@
 TInt DMemoryManager::MovePage(	DMemoryObject* aMemory, SPageInfo* aOldPageInfo, 
 								TPhysAddr& aNewPage, TUint aBlockZoneId, TBool aBlockRest)
 	{
+	MmuLock::Unlock();
 	return KErrNotSupported;
 	}
 
 
 TInt DMemoryManager::MoveAndAllocPage(DMemoryObject*, SPageInfo*, TZonePageType)
 	{
+	__NK_ASSERT_DEBUG(0);	// This should only be invoked on managers that can move or discard pages.
 	return KErrNotSupported;
 	}
 
@@ -748,20 +750,8 @@
 										TPhysAddr& aNewPage, TUint aBlockZoneId, TBool aBlockRest)
 	{
 	__NK_ASSERT_DEBUG(RamAllocLock::IsHeld());
-
-	// Allocate the new page to move to, ensuring that we use the page type of the
-	// manager assigned to this page.
-	TPhysAddr newPage;
-	Mmu& m = TheMmu;
-	TInt r = m.AllocRam(&newPage, 1, aMemory->RamAllocFlags(), aMemory->iManager->PageType(), 
-						aBlockZoneId, aBlockRest);
-	if (r != KErrNone)
-		{// Failed to allocate a new page to move the page to so can't continue.
-		return r;
-		}
-	
-	r = KErrInUse;
-	MmuLock::Lock();
+	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
+	TInt r = KErrInUse;
 
 	TUint index = aOldPageInfo->Index();
 	TRACE(	("DMovableMemoryManager::MovePage(0x%08x,0x%08x,?,0x%08x,%d) index=0x%x",
@@ -774,7 +764,6 @@
 	if (!movingPageArrayPtr)
 		{// Can't move the page another operation is being performed on it.
 		MmuLock::Unlock();
-		TheMmu.FreeRam(&newPage, 1, aMemory->iManager->PageType());
 		return r;
 		}
 	__NK_ASSERT_DEBUG(RPageArray::IsPresent(*movingPageArrayPtr));
@@ -787,13 +776,41 @@
 		__NK_ASSERT_DEBUG(SPageInfo::FromPhysAddr(oldPage)->Type() == SPageInfo::EShadow);
 		}
 #endif
+	// Set the modifier so we can detect if the page state is updated.
+	aOldPageInfo->SetModifier(&pageIter);
+
+	MmuLock::Unlock();
+
+	// Allocate the new page to move to, ensuring that we use the page type of the
+	// manager assigned to this page.
+	TPhysAddr newPage;
+	Mmu& m = TheMmu;
+	TInt allocRet = m.AllocRam(&newPage, 1, aMemory->RamAllocFlags(), aMemory->iManager->PageType(), 
+						aBlockZoneId, aBlockRest);
+	if (allocRet != KErrNone)
+		{
+		MmuLock::Lock();
+		aMemory->iPages.MovePageEnd(*movingPageArrayPtr, index);
+		MmuLock::Unlock();
+		return allocRet;
+		}
+
 	__NK_ASSERT_DEBUG((newPage & KPageMask) == 0);
 	__NK_ASSERT_DEBUG(newPage != oldPage);
 
-	// Set the modifier so we can detect if the page state is updated.
-	aOldPageInfo->SetModifier(&pageIter);
+	MmuLock::Lock();
+	if (aOldPageInfo->CheckModified(&pageIter) ||
+		oldPageEntry != *movingPageArrayPtr)
+		{// The page was modified or freed.
+		aMemory->iPages.MovePageEnd(*movingPageArrayPtr, index);
+		MmuLock::Unlock();
+		m.FreeRam(&newPage, 1, aMemory->iManager->PageType());
+		return r;
+		}
+	MmuLock::Unlock();
 
-	// Restrict the page ready for moving.
+	// This page's contents may be changed so restrict the page to no access 
+	// so we can detect any access to it while we are moving it.
 	// Read only memory objects don't need to be restricted but we still need
 	// to discover any physically pinned mappings.
 	TBool pageRestrictedNA = !aMemory->IsReadOnly();
@@ -801,9 +818,6 @@
 										ERestrictPagesNoAccessForMoving :
 										ERestrictPagesForMovingFlag;
 
-	// This page's contents may be changed so restrict the page to no access 
-	// so we can detect any access to it while we are moving it.
-	MmuLock::Unlock();
 	// This will clear the memory objects mapping added flag so we can detect any new mappings.
 	aMemory->RestrictPages(pageIter, restrictType);
 
@@ -816,7 +830,8 @@
 	// If the page array entry (*movingPageArrayPtr) has been modified then a pinning 
 	// veto'd the preparation.
 	MmuLock::Lock();
-	if (aOldPageInfo->CheckModified(&pageIter) || oldPageEntry != *movingPageArrayPtr)
+	if (aOldPageInfo->CheckModified(&pageIter) ||
+		oldPageEntry != *movingPageArrayPtr)
 		{// Page is pinned or has been modified by another operation.
 		MmuLock::Unlock();
 		TheMmu.FreeRam(&newPage, 1, aMemory->iManager->PageType());
@@ -841,7 +856,8 @@
 #endif
 	
 	MmuLock::Lock();
-	if (!aOldPageInfo->CheckModified(&pageIter) && oldPageEntry == *movingPageArrayPtr &&
+	if (!aOldPageInfo->CheckModified(&pageIter) &&
+		oldPageEntry == *movingPageArrayPtr &&
 		!aMemory->MappingAddedFlag())
 		{
 		// The page has been copied without anyone modifying it so set the page 
@@ -888,7 +904,7 @@
 #endif
 	// indicate we've stopped moving memory now...
 	MmuLock::Lock();
-	RPageArray::MovePageEnd(*movingPageArrayPtr);
+	aMemory->iPages.MovePageEnd(*movingPageArrayPtr, index);
 	MmuLock::Unlock();
 
 	return r;
@@ -1119,7 +1135,10 @@
 
 			// attempt to clean the page if it is dirty...
 			if (aPageInfo->IsDirty())
+				{
+				//Kern::Printf("WDP: Cleaning single page in StealPage");
 				aMemory->iManager->CleanPages(1, &aPageInfo, EFalse);
+				}
 
 			if(aPageInfo)
 				{
@@ -1535,10 +1554,7 @@
 
 	page = *p;
 	if(aPageInfo->CheckModified(&pageList) || page!=originalPage/*page state changed*/)
-		{
-		// page state was changed by someone else...
 		r = KErrInUse;
-		}
 	else
 		{
 		// nobody else has modified page state, so restrictions successfully applied...
@@ -1677,6 +1693,8 @@
 	TRACE(("DPagedMemoryManager::DoPin(0x%08x,0x%08x,0x%08x,0x%08x)",aMemory, aIndex, aCount, aMapping));
 	__ASSERT_CRITICAL;
 	__NK_ASSERT_DEBUG(aPinArgs.HaveSufficientPages(aCount));
+	__NK_ASSERT_DEBUG(aMapping->IsPinned());
+	__NK_ASSERT_DEBUG(!aMapping->PagesPinned());
 
 	// check and allocate page array entries...
 	RPageArray::TIter pageList;
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmapping.h	Tue Jul 06 15:50:07 2010 +0300
@@ -237,7 +237,7 @@
 	*/
 	FORCE_INLINE TBool IsPinned()
 		{ return Flags()&EPinned; }
-		
+
 	/**
 	Return true if this mapping physically pins the memory it maps.
 	*/
@@ -245,6 +245,12 @@
 		{ return Flags()&EPhysicalPinningMapping; }
 
 	/**
+	Return true if this mapping has beed successfully attached to a memory object, pinning its pages.
+	*/
+	FORCE_INLINE TBool PagesPinned()
+		{ return Flags()&EPagesPinned; }		
+		
+	/**
 	Return the access permissions which this mapping uses to maps memory.
 	*/
 	FORCE_INLINE TMappingPermissions Permissions()
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmu.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -859,8 +859,14 @@
 		}
 #endif
 	TInt missing = iRamPageAllocator->AllocRamPages(aPages, aCount, aZonePageType, aBlockZoneId, aBlockRest);
-	if(missing && !(aFlags&EAllocNoPagerReclaim) && ThePager.GetFreePages(missing))
-		missing = iRamPageAllocator->AllocRamPages(aPages, aCount, aZonePageType, aBlockZoneId, aBlockRest);
+	if(missing && !(aFlags&EAllocNoPagerReclaim))
+		{
+		// taking the page cleaning lock here prevents the pager releasing the ram alloc lock
+		PageCleaningLock::Lock();  
+		if (ThePager.GetFreePages(missing))
+			missing = iRamPageAllocator->AllocRamPages(aPages, aCount, aZonePageType, aBlockZoneId, aBlockRest);
+		PageCleaningLock::Unlock();  
+		}
 	TInt r = missing ? KErrNoMemory : KErrNone;
 	if(r!=KErrNone)
 		iRamAllocFailed = ETrue;
@@ -1644,48 +1650,65 @@
 
 	// get page to remap...
 	TPhysAddr pagePhys = aPage;
-	
+
 	// Only remap the page if it is committed or it is being moved and
 	// no other operation has been performed on the page.
 	if(!RPageArray::TargetStateIsCommitted(pagePhys))
 		return; // page no longer needs mapping
-	
+
 	// Only remap the page if it is currently mapped, i.e. doesn't have an unallocated pte.
 	// This will only be true if a new mapping is being added but it hasn't yet updated 
 	// all the ptes for the pages that it maps.
 	TPte pte = *aPtePtr;
 	if (pte == KPteUnallocatedEntry)
 		return;
-	
+
 	// clear type flags...
 	pagePhys &= ~KPageMask;
 
+	// Get the SPageInfo of the page to map.  Allow pages without SPageInfos to
+	// be mapped as when freeing a shadow page may need to remap an unpaged ROM 
+	// page which won't have an SPageInfo.
 	SPageInfo* pi = SPageInfo::SafeFromPhysAddr(pagePhys);
 	if (pi)
 		{
 		SPageInfo::TPagedState pagedState = pi->PagedState();
 		if (pagedState != SPageInfo::EUnpaged)
 			{
-			// The page is demand paged.  Only remap the page if it is pinned or is currently
-			// accessible but to the old physical page.
-			if (pagedState != SPageInfo::EPagedPinned &&
-				 (Mmu::IsPteInaccessible(pte) || (pte^pagePhys) < TPte(KPageSize)))
-				return;
-			if (!pi->IsDirty())
+			// For paged pages only update the pte if the pte points to the wrong physical
+			// address or the page is pinned.
+			if (pagedState != SPageInfo::EPagedPinned)
 				{
-				// Ensure that the page is mapped as read only to prevent pages being marked dirty
-				// by page moving despite not having been written to
-				Mmu::MakePteInaccessible(aBlankPte, EFalse);
+				if ((pte^pagePhys) < TPte(KPageSize))
+					return;
+				if (Mmu::IsPteInaccessible(pte))
+					{
+					// Updating this pte shouldn't be necessary but it stops random data 
+					// corruption in stressed cases???
+					Mmu::MakePteInaccessible(aBlankPte, EFalse);
+					}
+				else if (!pi->IsDirty())
+					{
+					// Ensure that the page is mapped as read only to prevent pages being writable 
+					// without having been marked dirty.
+					Mmu::MakePteInaccessible(aBlankPte, ETrue);
+					}
+				}
+			else if (!pi->IsDirty())
+				{
+				// Ensure that the page is mapped as read only to prevent pages being writable 
+				// without having been marked dirty.
+				Mmu::MakePteInaccessible(aBlankPte, ETrue);
 				}
 			}
 		}
-	
+
 	// Map the page in the page array entry as this is always the physical
 	// page that the memory object's page should be mapped to.
 	pte = pagePhys|aBlankPte;
 	TRACE2(("!PTE %x=%x",aPtePtr,pte));
 	*aPtePtr = pte;
-	
+
 	// clean cache...
 	CacheMaintenance::SinglePteUpdated((TLinAddr)aPtePtr);
 	}
@@ -1964,7 +1987,10 @@
 			}
 #endif
 		if(!Mmu::IsPteMoreAccessible(aBlankPte,pte))
+			{
+			__NK_ASSERT_DEBUG((pte^page) < (TUint)KPageSize); // Must be the same physical addr.
 			return true; // return true to keep page table (it already had at least page mapped)
+			}
 
 		// remap page with new increased permissions...
 		if(pte==KPteUnallocatedEntry)
@@ -2017,6 +2043,8 @@
 					TRACE2(("!PTE %x=%x",pPte-1,pte));
 					pPte[-1] = pte;
 					}
+				else
+					__NK_ASSERT_DEBUG((pte^page) < (TUint)KPageSize); // Must be the same physical addr.	
 				}
 			}
 		while(pPte!=pPteEnd);
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mmu.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mmu.h	Tue Jul 06 15:50:07 2010 +0300
@@ -571,6 +571,23 @@
 		}
 
 	/**
+	Mark this page as an oldest old page.
+
+	This does not mark the object as modified as conceptually it's still an oldest page.  This means
+	that if a page goes from young -> old -> oldest the second transition will not interrupt the
+	page restriction that happens on the first.
+
+	@pre #MmuLock held.
+	*/
+	FORCE_INLINE void SetOldestPage(TPagedState aPagedState)
+		{
+		CheckAccess("SetPagedState");
+		__NK_ASSERT_DEBUG(iPagedState==EPagedOld);
+		__NK_ASSERT_DEBUG(aPagedState==EPagedOldestClean || aPagedState==EPagedOldestDirty);
+		iPagedState = aPagedState;
+		}
+
+	/**
 	Set the page's #iModifier value.
 
 	#iModifier is cleared to zero whenever the usage or paging state of the page
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mobject.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mobject.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -79,7 +79,10 @@
 		}
 
 	if(aCreateFlags&EMemoryCreateDemandPaged)
+		{
 		iFlags |= EDemandPaged;
+		iRamAllocFlags |= Mmu::EAllocNoPagerReclaim;
+		}
 	if(aCreateFlags&EMemoryCreateReserveAllResources)
 		iFlags |= EReserveResources;
 	if(aCreateFlags&EMemoryCreateDisallowPinning)
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mpagearray.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpagearray.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -1158,6 +1158,7 @@
 		return NULL;
 
 	*p = (page & ~EStateMask) | EMoving;
+	s->Lock();
 
 	aPageList.Set(iSegments, aIndex, aIndex+1);
 
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mpagearray.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpagearray.h	Tue Jul 06 15:50:07 2010 +0300
@@ -165,18 +165,6 @@
 		}
 
 	/**
-	Page moving has ended so set the page back to committed if no other 
-	operation has occurred/is occurring.
-
-	@param aEntry		A reference to the entry to update.
-	*/
-	static FORCE_INLINE void MovePageEnd(TPhysAddr& aEntry)
-		{
-		if (State(aEntry) == EMoving)
-			aEntry = (aEntry & ~EStateMask) | ECommitted;
-		}
-
-	/**
 	Update the physical address in the array entry \a aEntry.
 	@param aEntry		A reference to the entry to update.
 	@param aPhysAddr	The new physical address.
@@ -416,6 +404,17 @@
 	*/
 	TPhysAddr* MovePageStart(TUint aIndex, TIter& aPageList);
 
+
+	/**
+	Page moving has ended so set the page back to committed if no other 
+	operation has occurred/is occurring.
+
+	@param aEntry		A reference to the entry to update.
+	@param aIndex		The index of the page that was moved.
+	*/
+	void MovePageEnd(TPhysAddr& aEntry, TUint aIndex);
+
+
 	/**
 	Return the array entry for index \a aIndex.
 	*/
@@ -861,4 +860,12 @@
 	MmuLock::Unlock();
 	}
 
+FORCE_INLINE void RPageArray::MovePageEnd(TPhysAddr& aEntry, TUint aIndex)
+	{
+	__NK_ASSERT_DEBUG(PageEntry(aIndex) == &aEntry);
+	if (State(aEntry) == EMoving)
+		aEntry = (aEntry & ~EStateMask) | ECommitted;
+	ReleasePage(aIndex, 0);
+	}
+
 #endif
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpager.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -43,21 +43,34 @@
 */
 const TUint	KAbsoluteMaxPageCount = (1u<<(32-KPageShift))-1u;
 
-/*
-Limit the maximum number of oldest pages to bound the time taken by SelectPagesToClean(), which is
-called with the MmuLock held.
+/**
+Default limit for the maximum number of oldest pages.
+
+If the data paging device sets iPreferredWriteShift, then this is increased if necessary to allow
+that many pages to be present.
+
+This limit exists to make our live list implementation a closer approximation to LRU, and to bound
+the time taken by SelectSequentialPagesToClean(), which is called with the MmuLock held.
 */
-const TUint KMaxOldestPages = 32;
+const TUint KDefaultMaxOldestPages = 32;
 
 static DMutex* ThePageCleaningLock = NULL;
 
 DPager ThePager;
 
 
-DPager::DPager()
-	: iMinimumPageCount(0), iMaximumPageCount(0), iYoungOldRatio(0),
-	  iYoungCount(0), iOldCount(0), iOldestCleanCount(0),
-	  iNumberOfFreePages(0), iReservePageCount(0), iMinimumPageLimit(0)
+DPager::DPager() :
+	iMinimumPageCount(0),
+	iMaximumPageCount(0),
+	iYoungOldRatio(0),
+	iYoungCount(0),
+	iOldCount(0),
+	iOldestCleanCount(0),
+	iMaxOldestPages(KDefaultMaxOldestPages),
+	iNumberOfFreePages(0),
+	iReservePageCount(0),
+	iMinimumPageLimit(0),
+	iPagesToClean(1)
 #ifdef __DEMAND_PAGING_BENCHMARKS__
 	, iBenchmarkLock(TSpinLock::EOrderGenericIrqHigh3)
 #endif	  
@@ -445,8 +458,7 @@
 		case SPageInfo::EPagedOld:
 		case SPageInfo::EPagedOldestClean:
 		case SPageInfo::EPagedOldestDirty:
-			{// Update the list links point to the new page.
-			__NK_ASSERT_DEBUG(iYoungCount);
+			{// Update the list links to point to the new page.
 			SDblQueLink* prevLink = aOldPageInfo.iLink.iPrev;
 #ifdef _DEBUG
 			SDblQueLink* nextLink = aOldPageInfo.iLink.iNext;
@@ -485,19 +497,84 @@
 	}
 
 
-TInt DPager::TryStealOldestPage(SPageInfo*& aPageInfoOut)
+SPageInfo* DPager::StealOrAllocPage(TBool aAllowAlloc, Mmu::TRamAllocFlags aAllocFlags)
 	{
 	__NK_ASSERT_DEBUG(RamAllocLock::IsHeld());
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 
-	// find oldest page in list...
+	// The PageCleaningLock may or may not be held to start with
+	TBool pageCleaningLockAcquired = EFalse;
+
 	SDblQueLink* link;
+	SPageInfo* pageInfo ;
+	
+restart:
+
+	// if there is a free page in the live list then use that (it will be at the end)...
+	if (iOldestCleanCount)
+		{
+		__NK_ASSERT_DEBUG(!iOldestCleanList.IsEmpty());
+		link = iOldestCleanList.Last();
+		pageInfo = SPageInfo::FromLink(link);
+		if(pageInfo->Type()==SPageInfo::EUnused)
+			goto try_steal_from_page_info;
+		}
+	
+	// maybe try getting a free page from the system pool...
+	if (aAllowAlloc && !HaveMaximumPages())
+		{
+		MmuLock::Unlock();
+		pageInfo = GetPageFromSystem(aAllocFlags);
+		MmuLock::Lock();
+		if (pageInfo)
+			goto exit;
+		}
+	
+	// try stealing the oldest clean page on the  live list if there is one...
 	if (iOldestCleanCount)
 		{
 		__NK_ASSERT_DEBUG(!iOldestCleanList.IsEmpty());
 		link = iOldestCleanList.Last();
+		goto try_steal_from_link;
 		}
-	else if (iOldestDirtyCount)
+
+	// no clean oldest pages, see if we can clean multiple dirty pages in one go...
+	if (iOldestDirtyCount > 1 && iPagesToClean > 1)
+		{
+		__NK_ASSERT_DEBUG(!iOldestDirtyList.IsEmpty());
+
+		// check if we hold page cleaning lock
+		TBool needPageCleaningLock = !PageCleaningLock::IsHeld();
+		if (needPageCleaningLock)
+			{
+			// temporarily release ram alloc mutex and acquire page cleaning mutex
+			MmuLock::Unlock();
+			RamAllocLock::Unlock();
+			PageCleaningLock::Lock();
+			MmuLock::Lock();
+			}
+
+		// there may be clean pages now if we've waited on the page cleaning mutex, if so don't
+		// bother cleaning but just restart
+		if (iOldestCleanCount == 0 && iOldestDirtyCount >= 1)
+			CleanSomePages(EFalse);
+
+		if (needPageCleaningLock)
+			{
+			// release page cleaning mutex and re-aquire ram alloc mutex
+			MmuLock::Unlock();
+			PageCleaningLock::Unlock();			
+			RamAllocLock::Lock();
+			MmuLock::Lock();
+			}
+
+		// if there are now some clean pages we restart so as to take one of them
+		if (iOldestCleanCount > 0)
+			goto restart;
+		}
+
+	// otherwise just try to steal the oldest page...
+	if (iOldestDirtyCount)
 		{
 		__NK_ASSERT_DEBUG(!iOldestDirtyList.IsEmpty());
 		link = iOldestDirtyList.Last();
@@ -513,85 +590,81 @@
 		__NK_ASSERT_ALWAYS(!iYoungList.IsEmpty());
 		link = iYoungList.Last();
 		}
-	SPageInfo* pageInfo = SPageInfo::FromLink(link);
-
+
+try_steal_from_link:
+
+	// lookup page info
+	__NK_ASSERT_DEBUG(link);
+	pageInfo = SPageInfo::FromLink(link);
+	
+try_steal_from_page_info:
+	
+	// if the page is dirty and we don't hold the page cleaning mutex then we have to wait on it,
+	// and restart - we clean with the ram alloc mutex held in this case
 	if (pageInfo->IsDirty() && !PageCleaningLock::IsHeld())
-		return 1;
-
-	// try to steal it from owning object...
-	TInt r = StealPage(pageInfo);	
-	if (r == KErrNone)
-		{
-		BalanceAges();
-		aPageInfoOut = pageInfo;
+		{		
+		MmuLock::Unlock();
+		PageCleaningLock::Lock();
+		MmuLock::Lock();
+		pageCleaningLockAcquired = ETrue;
+		goto restart;
 		}
 	
-	return r;
-	}
-
-
-SPageInfo* DPager::StealOldestPage()
-	{
+	// try to steal it from owning object...
+	if (StealPage(pageInfo) != KErrNone)
+		goto restart;
+	
+	BalanceAges();
+	
+exit:
+	if (pageCleaningLockAcquired)
+		{		
+		MmuLock::Unlock();
+		PageCleaningLock::Unlock();
+		MmuLock::Lock();
+		}
+
+	__NK_ASSERT_DEBUG(RamAllocLock::IsHeld());
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
-	TBool pageCleaningLockHeld = EFalse;
-	for(;;)
-		{
-		SPageInfo* pageInfo = NULL;
-		TInt r = TryStealOldestPage(pageInfo);
-		
-		if (r == KErrNone)
-			{
-			if (pageCleaningLockHeld)
-				{
-				MmuLock::Unlock();
-				PageCleaningLock::Unlock();
-				MmuLock::Lock();
-				}
-			return pageInfo;
-			}
-		else if (r == 1)
-			{
-			__NK_ASSERT_ALWAYS(!pageCleaningLockHeld);
-			MmuLock::Unlock();
-			PageCleaningLock::Lock();
-			MmuLock::Lock();
-			pageCleaningLockHeld = ETrue;
-			}
-		// else retry...
-		}
+	
+	return pageInfo;
 	}
 
-#ifdef __CPU_CACHE_HAS_COLOUR
-
-template <class T, TInt maxObjects> class TSequentialColourSelector
+
+template <class T, TUint maxObjects> class TSequentialColourSelector
 	{
 public:
-	static const TInt KMaxLength = maxObjects;
-	static const TInt KArrayLength = _ALIGN_UP(KMaxLength, KPageColourCount);
+	enum
+		{
+		KMaxSearchLength = _ALIGN_UP(maxObjects, KPageColourCount)
+		};
 	
-	FORCE_INLINE TSequentialColourSelector()
+	FORCE_INLINE TSequentialColourSelector(TUint aTargetLength)
 		{
 		memclr(this, sizeof(*this));
+		__NK_ASSERT_DEBUG(aTargetLength <= maxObjects);
+		iTargetLength = aTargetLength;
+		iSearchLength = _ALIGN_UP(aTargetLength, KPageColourCount);
 		}
 
 	FORCE_INLINE TBool FoundLongestSequence()
 		{
-		return iLongestLength >= KMaxLength;
+		return iLongestLength >= iTargetLength;
 		}
 
-	FORCE_INLINE void AddCandidate(T* aObject, TInt aColour)
+	FORCE_INLINE void AddCandidate(T* aObject, TUint aColour)
 		{
 		// allocate objects to slots based on colour
-		for (TInt i = aColour ; i < KArrayLength ; i += KPageColourCount)
+		for (TUint i = aColour ; i < iSearchLength ; i += KPageColourCount)
 			{
 			if (!iSlot[i])
 				{
 				iSlot[i] = aObject;
 				iSeqLength[i] = i == 0 ? 1 : iSeqLength[i - 1] + 1;
-				TInt j = i + 1;
-				while(j < KArrayLength && iSeqLength[j])
+				TUint j = i + 1;
+				while(j < iSearchLength && iSeqLength[j])
 					iSeqLength[j++] += iSeqLength[i];
-				TInt currentLength = iSeqLength[j - 1];
+				TUint currentLength = iSeqLength[j - 1];
 				if (currentLength > iLongestLength)
 					{
 					iLongestLength = currentLength;
@@ -602,31 +675,31 @@
 			}
 		}
 
-	FORCE_INLINE TInt FindLongestRun(T** aObjectsOut)
+	FORCE_INLINE TUint FindLongestRun(T** aObjectsOut)
 		{
 		if (iLongestLength == 0)
 			return 0;
 
-		if (iLongestLength < KMaxLength && iSlot[0] && iSlot[KArrayLength - 1])
+		if (iLongestLength < iTargetLength && iSlot[0] && iSlot[iSearchLength - 1])
 			{
 			// check possibility of wrapping
 
 			TInt i = 1;
 			while (iSlot[i]) ++i;  // find first hole
-			TInt wrappedLength = iSeqLength[KArrayLength - 1] + iSeqLength[i - 1];
+			TUint wrappedLength = iSeqLength[iSearchLength - 1] + iSeqLength[i - 1];
 			if (wrappedLength > iLongestLength)
 				{
 				iLongestLength = wrappedLength;
-				iLongestStart = KArrayLength - iSeqLength[KArrayLength - 1];
+				iLongestStart = iSearchLength - iSeqLength[iSearchLength - 1];
 				}
 			}		
 
-		iLongestLength = Min(iLongestLength, KMaxLength);
-
-		__NK_ASSERT_DEBUG(iLongestStart >= 0 && iLongestStart < KArrayLength);
-		__NK_ASSERT_DEBUG(iLongestStart + iLongestLength < 2 * KArrayLength);
-
-		TInt len = Min(iLongestLength, KArrayLength - iLongestStart);
+		iLongestLength = MinU(iLongestLength, iTargetLength);
+
+		__NK_ASSERT_DEBUG(iLongestStart < iSearchLength);
+		__NK_ASSERT_DEBUG(iLongestStart + iLongestLength < 2 * iSearchLength);
+
+		TUint len = MinU(iLongestLength, iSearchLength - iLongestStart);
 		wordmove(aObjectsOut, &iSlot[iLongestStart], len * sizeof(T*));
 		wordmove(aObjectsOut + len, &iSlot[0], (iLongestLength - len) * sizeof(T*));
 		
@@ -634,19 +707,22 @@
 		}
 
 private:
-	T* iSlot[KArrayLength];
-	TInt8 iSeqLength[KArrayLength];
-	TInt iLongestStart;
-	TInt iLongestLength;
+	TUint iTargetLength;
+	TUint iSearchLength;
+	TUint iLongestStart;
+	TUint iLongestLength;
+	T* iSlot[KMaxSearchLength];
+	TUint8 iSeqLength[KMaxSearchLength];
 	};
 
-TInt DPager::SelectPagesToClean(SPageInfo** aPageInfosOut)
+
+TInt DPager::SelectSequentialPagesToClean(SPageInfo** aPageInfosOut)
 	{
-	// select up to KMaxPagesToClean oldest dirty pages with sequential page colours
+	// select up to iPagesToClean oldest dirty pages with sequential page colours
 	
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 
-	TSequentialColourSelector<SPageInfo, KMaxPagesToClean> selector;
+	TSequentialColourSelector<SPageInfo, KMaxPagesToClean> selector(iPagesToClean);
 
 	SDblQueLink* link = iOldestDirtyList.Last();
 	while (link != &iOldestDirtyList.iA)
@@ -668,15 +744,14 @@
 	return selector.FindLongestRun(aPageInfosOut);
 	}
 
-#else
-
-TInt DPager::SelectPagesToClean(SPageInfo** aPageInfosOut)
+
+TInt DPager::SelectOldestPagesToClean(SPageInfo** aPageInfosOut)
 	{
-	// no page colouring restrictions, so just take up to KMaxPagesToClean oldest dirty pages
+	// select up to iPagesToClean oldest dirty pages
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
-	TInt pageCount = 0;
+	TUint pageCount = 0;
 	SDblQueLink* link = iOldestDirtyList.Last();
-	while (link != &iOldestDirtyList.iA && pageCount < KMaxPagesToClean)
+	while (link != &iOldestDirtyList.iA && pageCount < iPagesToClean)
 		{
 		SPageInfo* pi = SPageInfo::FromLink(link);
 		if (!pi->IsWritable())
@@ -691,20 +766,29 @@
 	return pageCount;
 	}
 
-#endif
-
 
 TInt DPager::CleanSomePages(TBool aBackground)
 	{
+	TRACE(("DPager::CleanSomePages"));
+	
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 	__NK_ASSERT_DEBUG(PageCleaningLock::IsHeld());
 	// ram alloc lock may or may not be held
 
 	SPageInfo* pageInfos[KMaxPagesToClean];
-	TInt pageCount = SelectPagesToClean(&pageInfos[0]);
+	TInt pageCount;
+	if (iCleanInSequence)
+		pageCount = SelectSequentialPagesToClean(&pageInfos[0]);
+	else
+		pageCount = SelectOldestPagesToClean(&pageInfos[0]);
 	
 	if (pageCount == 0)
+		{
+		TRACE2(("DPager::CleanSomePages no pages to clean", pageCount));
+		TRACE2(("  page counts %d, %d, %d, %d",
+				iYoungCount, iOldCount, iOldestCleanCount, iOldestDirtyCount));
 		return 0;
+		}
 	
 	TheDataPagedMemoryManager->CleanPages(pageCount, pageInfos, aBackground);
 
@@ -724,6 +808,8 @@
 			}
 		}
 
+	TRACE2(("DPager::CleanSomePages cleaned %d pages", pageCount));
+
 	return pageCount;
 	}
 
@@ -737,7 +823,6 @@
 
 TInt DPager::RestrictPage(SPageInfo* aPageInfo, TRestrictPagesType aRestriction)
 	{
-	TRACE(("DPager::RestrictPage(0x%08x,%d)",aPageInfo,aRestriction));
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 
 	TInt r;
@@ -763,7 +848,6 @@
 		MmuLock::Lock();
 		}
 
-	TRACE(("DPager::RestrictPage returns %d",r));
 	return r;
 	}
 
@@ -814,28 +898,25 @@
 
 TInt DPager::DiscardAndAllocPage(SPageInfo* aPageInfo, TZonePageType aPageType)
 	{
-	TInt r = DiscardPage(aPageInfo, KRamZoneInvalidId, EFalse);
+	TInt r = DiscardPage(aPageInfo, KRamZoneInvalidId, M::EMoveDisMoveDirty);
 	if (r == KErrNone)
 		{
 		TheMmu.MarkPageAllocated(aPageInfo->PhysAddr(), aPageType);
 		}
-	// Flash the ram alloc lock as we may have had to write a page out to swap.
-	RamAllocLock::Unlock();
-	RamAllocLock::Lock();
 	return r;
 	}
 
 
-static TBool DiscardCanStealPage(SPageInfo* aOldPageInfo, TBool aBlockRest)
+static TBool DiscardCanStealPage(SPageInfo* aOldPageInfo, TBool aMoveDirty)
 	{
  	// If the page is pinned or if the page is dirty and a general defrag is being performed then
 	// don't attempt to steal it
 	return aOldPageInfo->Type() == SPageInfo::EUnused ||
-		(aOldPageInfo->PagedState() != SPageInfo::EPagedPinned && (!aBlockRest || !aOldPageInfo->IsDirty()));	
+		(aOldPageInfo->PagedState() != SPageInfo::EPagedPinned && (!aMoveDirty || !aOldPageInfo->IsDirty()));	
 	}
 
 
-TInt DPager::DiscardPage(SPageInfo* aOldPageInfo, TUint aBlockZoneId, TBool aBlockRest)
+TInt DPager::DiscardPage(SPageInfo* aOldPageInfo, TUint aBlockZoneId, TUint aMoveDisFlags)
 	{
 	// todo: assert MmuLock not released
 	
@@ -843,19 +924,21 @@
 	
 	__NK_ASSERT_DEBUG(RamAllocLock::IsHeld());
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
-
-	if (!DiscardCanStealPage(aOldPageInfo, aBlockRest))
+	TBool moveDirty = (aMoveDisFlags & M::EMoveDisMoveDirty) != 0;
+	TBool blockRest = (aMoveDisFlags & M::EMoveDisBlockRest) != 0;
+
+	if (!DiscardCanStealPage(aOldPageInfo, moveDirty))
 		{
-		// The page is pinned or is dirty and this is a general defrag so move the page.
-		DMemoryObject* memory = aOldPageInfo->Owner();
 		// Page must be managed if it is pinned or dirty.
 		__NK_ASSERT_DEBUG(aOldPageInfo->Type()==SPageInfo::EManaged);
-		__NK_ASSERT_DEBUG(memory);
-		MmuLock::Unlock();
+		// The page is pinned or is dirty and this is a general defrag so move the page.
+		DMemoryObject* memory = aOldPageInfo->Owner();
+		memory->Open();
 		TPhysAddr newAddr;
 		TRACE2(("DPager::DiscardPage delegating pinned/dirty page to manager"));
-		TInt r = memory->iManager->MovePage(memory, aOldPageInfo, newAddr, aBlockZoneId, aBlockRest);
+		TInt r = memory->iManager->MovePage(memory, aOldPageInfo, newAddr, aBlockZoneId, blockRest);
 		TRACE(("< DPager::DiscardPage %d", r));
+		memory->AsyncClose();
 		return r;
 		}
 
@@ -875,7 +958,7 @@
 			{
 			// Allocate a new page for the live list as it has reached its minimum size.
 			TUint flags = EMemAttNormalCached | Mmu::EAllocNoWipe;
-			newPageInfo = GetPageFromSystem((Mmu::TRamAllocFlags)flags, aBlockZoneId, aBlockRest);
+			newPageInfo = GetPageFromSystem((Mmu::TRamAllocFlags)flags, aBlockZoneId, blockRest);
 			if (!newPageInfo)
 				{
 				TRACE(("< DPager::DiscardPage KErrNoMemory"));
@@ -894,7 +977,7 @@
 
 		// Re-acquire the mmulock and re-check that the page is not pinned or dirty.
 		MmuLock::Lock();
-		if (!DiscardCanStealPage(aOldPageInfo, aBlockRest))
+		if (!DiscardCanStealPage(aOldPageInfo, moveDirty))
 			{
 			// Page is now pinned or dirty so give up as it is in use.
 			r = KErrInUse;
@@ -952,17 +1035,15 @@
 			AddAsFreePage(newPageInfo);
 		else
 			ReturnPageToSystem(*newPageInfo);   // temporarily releases MmuLock
-		}
+		}	
+	MmuLock::Unlock();
 
 	if (havePageCleaningLock)
 		{
 		// Release the page cleaning mutex
-		MmuLock::Unlock();
 		PageCleaningLock::Unlock();
-		MmuLock::Lock();
-		}	
-	
-	MmuLock::Unlock();
+		}
+
 	TRACE(("< DPager::DiscardPage returns %d", r));
 	return r;	
 	}
@@ -1005,12 +1086,61 @@
 	}
 
 
-void DPager::ReturnPageToSystem()
+TBool DPager::TryReturnOldestPageToSystem()
 	{
 	__NK_ASSERT_DEBUG(RamAllocLock::IsHeld());
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
-
-	ReturnPageToSystem(*StealOldestPage());
+	__NK_ASSERT_DEBUG(iNumberOfFreePages>0);
+
+	SPageInfo* pageInfo = StealOrAllocPage(EFalse, (Mmu::TRamAllocFlags)0);
+	
+	// StealOrAllocPage may have released the MmuLock, so check there are still enough pages
+	// to remove one from the live list
+	if (iNumberOfFreePages>0)
+		{
+		ReturnPageToSystem(*pageInfo);
+		return ETrue;
+		}
+	else
+		{
+		AddAsFreePage(pageInfo);
+		return EFalse;
+		}
+	}
+
+
+TUint DPager::AllowAddFreePages(SPageInfo*& aPageInfo, TUint aNumPages)
+	{
+	if (iMinimumPageCount + iNumberOfFreePages == iMaximumPageCount)
+		{// The paging cache is already at the maximum size so steal a page
+		// so it can be returned to the system if required.
+		aPageInfo = StealOrAllocPage(EFalse, (Mmu::TRamAllocFlags)0);
+		__NK_ASSERT_DEBUG(aPageInfo->PagedState() == SPageInfo::EUnpaged);
+		return 1;
+		}
+	// The paging cache is not at its maximum so determine how many can be added to
+	// the paging cache without it growing past its maximum.
+	aPageInfo = NULL;
+	__NK_ASSERT_DEBUG(iMinimumPageCount + iNumberOfFreePages < iMaximumPageCount);
+	if (iMinimumPageCount + iNumberOfFreePages + aNumPages > iMaximumPageCount)
+		{
+		return iMaximumPageCount - (iMinimumPageCount + iNumberOfFreePages);
+		}
+	else
+		return aNumPages;
+	}
+
+
+void DPager::AllowAddFreePage(SPageInfo*& aPageInfo)
+	{
+	if (iMinimumPageCount + iNumberOfFreePages == iMaximumPageCount)
+		{// The paging cache is already at the maximum size so steal a page
+		// so it can be returned to the system if required.
+		aPageInfo = StealOrAllocPage(EFalse, (Mmu::TRamAllocFlags)0);
+		__NK_ASSERT_DEBUG(aPageInfo->PagedState() == SPageInfo::EUnpaged);
+		return;
+		}
+	aPageInfo = NULL;
 	}
 
 
@@ -1039,98 +1169,23 @@
 
 SPageInfo* DPager::PageInAllocPage(Mmu::TRamAllocFlags aAllocFlags)
 	{
-	TBool pageCleaningLockHeld = EFalse;
-	SPageInfo* pageInfo;
-	TPhysAddr pagePhys;
-	TInt r = KErrGeneral;
+	// ram alloc mutex may or may not be held
+	__NK_ASSERT_DEBUG(!MmuLock::IsHeld());
 	
 	RamAllocLock::Lock();
-	MmuLock::Lock();
-
-find_a_page:
-	// try getting a free page from our live list...
-	if (iOldestCleanCount)
-		{
-		pageInfo = SPageInfo::FromLink(iOldestCleanList.Last());
-		if(pageInfo->Type()==SPageInfo::EUnused)
-			goto try_steal_oldest_page;
-		}
-
-	// try getting a free page from the system pool...
-	if(!HaveMaximumPages())
-		{
-		MmuLock::Unlock();
-		pageInfo = GetPageFromSystem(aAllocFlags);
-		if(pageInfo)
-			goto done;
-		MmuLock::Lock();
-		}
-
-	// try stealing a clean page...
-	if (iOldestCleanCount)
-		goto try_steal_oldest_page;
-
-	// see if we can clean multiple dirty pages in one go...
-	if (KMaxPagesToClean > 1 && iOldestDirtyCount > 1)
+	
+	MmuLock::Lock();	
+	SPageInfo* pageInfo = StealOrAllocPage(ETrue, aAllocFlags);
+	TBool wasAllocated = pageInfo->Type() == SPageInfo::EUnknown;
+	MmuLock::Unlock();
+
+	if (!wasAllocated)
 		{
-		// if we don't hold the page cleaning mutex then temporarily release ram alloc mutex and
-		// acquire page cleaning mutex; if we hold it already just proceed
-		if (!pageCleaningLockHeld)
-			{
-			MmuLock::Unlock();
-			RamAllocLock::Unlock();
-			PageCleaningLock::Lock();			
-			MmuLock::Lock();
-			}
-		
-		// there may be clean pages now if we've waited on the page cleaning mutex, if so don't
-		// bother cleaning but just restart
-		if (iOldestCleanCount == 0)
-			CleanSomePages(EFalse);
-		
-		if (!pageCleaningLockHeld)
-			{
-			MmuLock::Unlock();
-			PageCleaningLock::Unlock();			
-			RamAllocLock::Lock();
-			MmuLock::Lock();
-			}
-		
-		if (iOldestCleanCount > 0)
-			goto find_a_page;
+		// make page state same as a freshly allocated page...
+		TPhysAddr pagePhys = pageInfo->PhysAddr();
+		TheMmu.PagesAllocated(&pagePhys,1,aAllocFlags);
 		}
 
-	// as a last resort, steal a page from the live list...
-	
-try_steal_oldest_page:
-	__NK_ASSERT_ALWAYS(iOldestCleanCount|iOldestDirtyCount|iOldCount|iYoungCount);
-	r = TryStealOldestPage(pageInfo);
-	// if this fails we restart whole process
-	if (r < KErrNone)
-		goto find_a_page;
-
-	// if we need to clean, acquire page cleaning mutex for life of this function
-	if (r == 1)
-		{
-		__NK_ASSERT_ALWAYS(!pageCleaningLockHeld);
-		MmuLock::Unlock();
-		PageCleaningLock::Lock();
-		MmuLock::Lock();
-		pageCleaningLockHeld = ETrue;
-		goto find_a_page;		
-		}
-
-	// otherwise we're done!
-	__NK_ASSERT_DEBUG(r == KErrNone);
-	MmuLock::Unlock();
-
-	// make page state same as a freshly allocated page...
-	pagePhys = pageInfo->PhysAddr();
-	TheMmu.PagesAllocated(&pagePhys,1,aAllocFlags);
-
-done:
-	if (pageCleaningLockHeld)
-		PageCleaningLock::Unlock();
 	RamAllocLock::Unlock();
 
 	return pageInfo;
@@ -1146,8 +1201,8 @@
 	MmuLock::Lock();
 	while(aNumPages>0 && (TInt)NumberOfFreePages()>=aNumPages)
 		{
-		ReturnPageToSystem();
-		--aNumPages;
+		if (TryReturnOldestPageToSystem())
+			--aNumPages;
 		}
 	MmuLock::Unlock();
 
@@ -1166,9 +1221,18 @@
 	TPhysAddr* end = aPages+aCount;
 	while(aPages<end)
 		{
+		// Steal a page from the paging cache in case we need to return one to the system.
+		// This may release the ram alloc lock.
+		SPageInfo* pageInfo;
+		AllowAddFreePage(pageInfo);
+
 		TPhysAddr pagePhys = *aPages++;
 		if(RPageArray::State(pagePhys)!=RPageArray::ECommitted)
+			{
+			if (pageInfo)
+				AddAsFreePage(pageInfo);
 			continue; // page is not present
+			}
 
 #ifdef _DEBUG
 		SPageInfo* pi = SPageInfo::SafeFromPhysAddr(pagePhys&~KPageMask);
@@ -1191,26 +1255,31 @@
 		case SPageInfo::EPagedOld:
 		case SPageInfo::EPagedOldestDirty:
 		case SPageInfo::EPagedOldestClean:
+			if (pageInfo)
+				AddAsFreePage(pageInfo);
 			continue; // discard already been allowed
 
 		case SPageInfo::EPagedPinned:
 			__NK_ASSERT_DEBUG(0);
 		default:
 			__NK_ASSERT_DEBUG(0);
+			if (pageInfo)
+				AddAsFreePage(pageInfo);
 			continue;
 			}
 
-		// put page on live list...
+		// put page on live list and free the stolen page...
 		AddAsYoungestPage(pi);
 		++iNumberOfFreePages;
-
+		if (pageInfo)
+			ReturnPageToSystem(*pageInfo);
 		Event(EEventPageDonate,pi);
 
 		// re-balance live list...
-		RemoveExcessPages();
 		BalanceAges();
 		}
 
+	__NK_ASSERT_DEBUG((iMinimumPageCount + iNumberOfFreePages) <= iMaximumPageCount);
 	MmuLock::Unlock();
 	RamAllocLock::Unlock();
 	}
@@ -1262,7 +1331,7 @@
 			}
 
 		// check paging list has enough pages before we remove one...
-		if(iNumberOfFreePages<1)
+		if(!iNumberOfFreePages)
 			{
 			// need more pages so get a page from the system...
 			if(!TryGrowLiveList())
@@ -1298,8 +1367,15 @@
 
 	// we may have added a spare free page to the live list without removing one,
 	// this could cause us to have too many pages, so deal with this...
+
+	// If there are too many pages they should all be unused free pages otherwise 
+	// the ram alloc lock may be released by RemoveExcessPages().
+	__NK_ASSERT_DEBUG(	!HaveTooManyPages() ||
+						(iMinimumPageCount + iNumberOfFreePages - iMaximumPageCount
+						<= iOldestCleanCount));
 	RemoveExcessPages();
 
+	__NK_ASSERT_DEBUG((iMinimumPageCount + iNumberOfFreePages) <= iMaximumPageCount);
 	MmuLock::Unlock();
 	RamAllocLock::Unlock();
 	return r;
@@ -1333,61 +1409,89 @@
 void DPager::BalanceAges()
 	{
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
-	TBool restrictPage = EFalse;
-	SPageInfo* pageInfo = NULL;
-	TUint oldestCount = iOldestCleanCount + iOldestDirtyCount;
-	if((iOldCount + oldestCount) * iYoungOldRatio < iYoungCount)
+	TBool retry;
+	do
 		{
-		// Need more old pages so make one young page into an old page...
-		__NK_ASSERT_DEBUG(!iYoungList.IsEmpty());
-		__NK_ASSERT_DEBUG(iYoungCount);
-		SDblQueLink* link = iYoungList.Last()->Deque();
-		--iYoungCount;
-
-		pageInfo = SPageInfo::FromLink(link);
-		pageInfo->SetPagedState(SPageInfo::EPagedOld);
-
-		iOldList.AddHead(link);
-		++iOldCount;
-
-		Event(EEventPageAged,pageInfo);
-		// Delay restricting the page until it is safe to release the MmuLock.
-		restrictPage = ETrue;
-		}
-
-	// Check we have enough oldest pages.
-	if (oldestCount < KMaxOldestPages &&
-		oldestCount * iOldOldestRatio < iOldCount)
-		{
-		__NK_ASSERT_DEBUG(!iOldList.IsEmpty());
-		__NK_ASSERT_DEBUG(iOldCount);
-		SDblQueLink* link = iOldList.Last()->Deque();
-		--iOldCount;
-
-		SPageInfo* oldestPageInfo = SPageInfo::FromLink(link);
-		if (oldestPageInfo->IsDirty())
+		retry = EFalse;
+		TBool restrictPage = EFalse;
+		SPageInfo* pageInfo = NULL;
+		TUint oldestCount = iOldestCleanCount + iOldestDirtyCount;
+		if((iOldCount + oldestCount) * iYoungOldRatio < iYoungCount)
+			{
+			// Need more old pages so make one young page into an old page...
+			__NK_ASSERT_DEBUG(!iYoungList.IsEmpty());
+			__NK_ASSERT_DEBUG(iYoungCount);
+			SDblQueLink* link = iYoungList.Last()->Deque();
+			--iYoungCount;
+
+			pageInfo = SPageInfo::FromLink(link);
+			pageInfo->SetPagedState(SPageInfo::EPagedOld);
+
+			iOldList.AddHead(link);
+			++iOldCount;
+
+			Event(EEventPageAged,pageInfo);
+			// Delay restricting the page until it is safe to release the MmuLock.
+			restrictPage = ETrue;
+			}
+
+		// Check we have enough oldest pages.
+		if (oldestCount < iMaxOldestPages &&
+			oldestCount * iOldOldestRatio < iOldCount)
 			{
-			oldestPageInfo->SetPagedState(SPageInfo::EPagedOldestDirty);
-			iOldestDirtyList.AddHead(link);
-			++iOldestDirtyCount;
-			PageCleaner::NotifyPagesToClean();
-			Event(EEventPageAgedDirty,oldestPageInfo);
+			__NK_ASSERT_DEBUG(!iOldList.IsEmpty());
+			__NK_ASSERT_DEBUG(iOldCount);
+			SDblQueLink* link = iOldList.Last()->Deque();
+			--iOldCount;
+
+			SPageInfo* oldestPageInfo = SPageInfo::FromLink(link);
+			if (oldestPageInfo->IsDirty())
+				{
+				oldestPageInfo->SetOldestPage(SPageInfo::EPagedOldestDirty);
+				iOldestDirtyList.AddHead(link);
+				++iOldestDirtyCount;
+				PageCleaner::NotifyPagesToClean();
+				Event(EEventPageAgedDirty,oldestPageInfo);
+				}
+			else
+				{
+				oldestPageInfo->SetOldestPage(SPageInfo::EPagedOldestClean);
+				iOldestCleanList.AddHead(link);
+				++iOldestCleanCount;
+				Event(EEventPageAgedClean,oldestPageInfo);
+				}
 			}
-		else
+
+		if (restrictPage)
 			{
-			oldestPageInfo->SetPagedState(SPageInfo::EPagedOldestClean);
-			iOldestCleanList.AddHead(link);
-			++iOldestCleanCount;
-			Event(EEventPageAgedClean,oldestPageInfo);
+			// Make the recently aged old page inaccessible.  This is done last as it will release
+			// the MmuLock and therefore the page counts may otherwise change.
+			TInt r = RestrictPage(pageInfo,ERestrictPagesNoAccessForOldPage);
+
+			if (r == KErrInUse)
+				{
+				SPageInfo::TPagedState state = pageInfo->PagedState();
+				if (state == SPageInfo::EPagedOld ||
+					state == SPageInfo::EPagedOldestClean ||
+					state == SPageInfo::EPagedOldestDirty)
+					{
+					// The restrict operation failed, but the page was left in an old state.  This
+					// can happen when:
+					//  
+					//  - pages are in the process of being pinned - the mapping will veto the
+					//    restriction
+					//  - pages are rejuvenated and then become quickly become old again
+					//  
+					// In the second instance the page will be needlessly rejuvenated because we
+					// can't tell that it has actually been restricted by another thread
+					RemovePage(pageInfo);
+					AddAsYoungestPage(pageInfo);
+					retry = ETrue;
+					}
+				}
 			}
 		}
-
-	if (restrictPage)
-		{
-		// Make the recently aged old page inaccessible.  This is done last as it 
-		// will release the MmuLock and therefore the page counts may otherwise change.
-		RestrictPage(pageInfo,ERestrictPagesNoAccessForOldPage);
-		}
+	while (retry);
 	}
 
 
@@ -1396,7 +1500,7 @@
 	__NK_ASSERT_DEBUG(RamAllocLock::IsHeld());
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 	while(HaveTooManyPages())
-		ReturnPageToSystem();
+		TryReturnOldestPageToSystem();
 	}
 
 
@@ -1688,6 +1792,8 @@
 
 void DPager::Pin(SPageInfo* aPageInfo, TPinArgs& aPinArgs)
 	{
+	TRACE(("DPager::Pin %08x", aPageInfo->PhysAddr()));
+	
 	__ASSERT_CRITICAL;
 	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 	__NK_ASSERT_DEBUG(aPinArgs.HaveSufficientPages(1));
@@ -1837,6 +1943,17 @@
 		}
 	while(TryGrowLiveList());
 
+	if (!ok)
+		{// Failed to allocate enough pages so free any excess..
+
+		// If there are too many pages they should all be unused free pages otherwise 
+		// the ram alloc lock may be released by RemoveExcessPages().
+		__NK_ASSERT_DEBUG(	!HaveTooManyPages() ||
+							(iMinimumPageCount + iNumberOfFreePages - iMaximumPageCount
+							<= iOldestCleanCount));
+		RemoveExcessPages();
+		}
+	__NK_ASSERT_DEBUG((iMinimumPageCount + iNumberOfFreePages) <= iMaximumPageCount);
 	MmuLock::Unlock();
 	RamAllocLock::Unlock();
 	return ok;
@@ -1851,9 +1968,19 @@
 	RamAllocLock::Lock();
 	MmuLock::Lock();
 
-	iNumberOfFreePages += aNumPages;
-	RemoveExcessPages();
-
+	while (aNumPages)
+		{
+		SPageInfo* pageInfo;
+		// This may release the ram alloc lock but it will flash the mmulock
+		// if not all pages could be added in one go, i.e. freePages != aNumPages.
+		TUint freePages = AllowAddFreePages(pageInfo, aNumPages);
+		iNumberOfFreePages += freePages;
+		aNumPages -= freePages;
+		if (pageInfo)
+			ReturnPageToSystem(*pageInfo);
+		}
+
+	__NK_ASSERT_DEBUG((iMinimumPageCount + iNumberOfFreePages) <= iMaximumPageCount);
 	MmuLock::Unlock();
 	RamAllocLock::Unlock();
 	}
@@ -1993,7 +2120,10 @@
 
 TInt DPager::ResizeLiveList(TUint aMinimumPageCount, TUint aMaximumPageCount)
 	{
-	TRACE(("DPager::ResizeLiveList(%d,%d) current young=%d old=%d min=%d free=%d max=%d",aMinimumPageCount,aMaximumPageCount,iYoungCount,iOldCount,iMinimumPageCount,iNumberOfFreePages,iMaximumPageCount));
+	TRACE(("DPager::ResizeLiveList(%d,%d) current: %d %d %d %d, %d %d %d",
+		   aMinimumPageCount,aMaximumPageCount,
+		   iYoungCount,iOldCount,iOldestCleanCount,iOldestDirtyCount,
+		   iMinimumPageCount,iNumberOfFreePages,iMaximumPageCount));
 	__NK_ASSERT_DEBUG(CacheInitialised());
 
 	if(!aMaximumPageCount)
@@ -2005,12 +2135,17 @@
 		aMaximumPageCount = KAbsoluteMaxPageCount;
 
 	// Min must not be greater than max...
-	if(aMinimumPageCount>aMaximumPageCount)
+	if(aMinimumPageCount > aMaximumPageCount)
 		return KErrArgument;
-
+	
 	NKern::ThreadEnterCS();
 	RamAllocLock::Lock();
 
+	// We must hold this otherwise StealOrAllocPage will release the RamAllocLock while waiting for
+	// it.  Note this method is not used in producton, so it's ok to hold both locks for longer than
+	// would otherwise happen.
+	PageCleaningLock::Lock();  
+
 	MmuLock::Lock();
 
 	__NK_ASSERT_ALWAYS(iYoungOldRatio);
@@ -2018,68 +2153,67 @@
 	// Make sure aMinimumPageCount is not less than absolute minimum we can cope with...
 	iMinimumPageLimit = iMinYoungPages * (1 + iYoungOldRatio) / iYoungOldRatio
 						+ DPageReadRequest::ReservedPagesRequired();
-	if(iMinimumPageLimit<iAbsoluteMinPageCount)
+	if(iMinimumPageLimit < iAbsoluteMinPageCount)
 		iMinimumPageLimit = iAbsoluteMinPageCount;
-	if(aMinimumPageCount<iMinimumPageLimit+iReservePageCount)
-		aMinimumPageCount = iMinimumPageLimit+iReservePageCount;
-	if(aMaximumPageCount<aMinimumPageCount)
-		aMaximumPageCount=aMinimumPageCount;
+	if(aMinimumPageCount < iMinimumPageLimit + iReservePageCount)
+		aMinimumPageCount = iMinimumPageLimit + iReservePageCount;
+	if(aMaximumPageCount < aMinimumPageCount)
+		aMaximumPageCount = aMinimumPageCount;
 
 	// Increase iMaximumPageCount?
 	if(aMaximumPageCount > iMaximumPageCount)
 		iMaximumPageCount = aMaximumPageCount;
 
 	// Reduce iMinimumPageCount?
-	TInt spare = iMinimumPageCount-aMinimumPageCount;
-	if(spare>0)
+	if(aMinimumPageCount < iMinimumPageCount)
 		{
-		iMinimumPageCount -= spare;
-		iNumberOfFreePages += spare;
+		iNumberOfFreePages += iMinimumPageCount - aMinimumPageCount;
+		iMinimumPageCount = aMinimumPageCount;
 		}
 
 	// Increase iMinimumPageCount?
-	TInt r=KErrNone;
-	while(iMinimumPageCount<aMinimumPageCount)
+	TInt r = KErrNone;
+	while(aMinimumPageCount > iMinimumPageCount)
 		{
-		TUint newMin = aMinimumPageCount;
-		TUint maxMin = iMinimumPageCount+iNumberOfFreePages;
-		if(newMin>maxMin)
-			newMin = maxMin;
-
-		TUint delta = newMin-iMinimumPageCount;
-		if(delta)
+		TUint newMin = MinU(aMinimumPageCount, iMinimumPageCount + iNumberOfFreePages);
+		
+		if (newMin == iMinimumPageCount)
 			{
+			// have to add pages before we can increase minimum page count
+			if(!TryGrowLiveList())
+				{
+				r = KErrNoMemory;
+				break;
+				}
+			}
+		else
+			{
+			iNumberOfFreePages -= newMin - iMinimumPageCount;
 			iMinimumPageCount = newMin;
-			iNumberOfFreePages -= delta;
-			continue;
-			}
-
-		if(!TryGrowLiveList())
-			{
-			r=KErrNoMemory;
-			break;
 			}
 		}
 
 	// Reduce iMaximumPageCount?
-	while(iMaximumPageCount>aMaximumPageCount)
+	while(aMaximumPageCount < iMaximumPageCount)
 		{
-		TUint newMax = aMaximumPageCount;
-		TUint minMax = iMinimumPageCount+iNumberOfFreePages;
-		if(newMax<minMax)
-			newMax = minMax;
-
-		TUint delta = iMaximumPageCount-newMax;
-		if(delta)
+		TUint newMax = MaxU(aMaximumPageCount, iMinimumPageCount + iNumberOfFreePages);
+
+		if (newMax == iMaximumPageCount)
+			{
+			// have to remove pages before we can reduce maximum page count
+			TryReturnOldestPageToSystem();
+			}
+		else
 			{
 			iMaximumPageCount = newMax;
-			continue;
 			}
-
-		ReturnPageToSystem();
 		}
-
-	TRACE(("DPager::ResizeLiveList end with young=%d old=%d min=%d free=%d max=%d",iYoungCount,iOldCount,iMinimumPageCount,iNumberOfFreePages,iMaximumPageCount));
+	
+	TRACE(("DPager::ResizeLiveList end: %d %d %d %d, %d %d %d",
+		   iYoungCount,iOldCount,iOldestCleanCount,iOldestDirtyCount,
+		   iMinimumPageCount,iNumberOfFreePages,iMaximumPageCount));
+	
+	__NK_ASSERT_DEBUG((iMinimumPageCount + iNumberOfFreePages) <= iMaximumPageCount);
 
 #ifdef BTRACE_KERNEL_MEMORY
 	BTrace4(BTrace::EKernelMemory,BTrace::EKernelMemoryDemandPagingCache,iMinimumPageCount << KPageShift);
@@ -2087,6 +2221,7 @@
 
 	MmuLock::Unlock();
 
+	PageCleaningLock::Unlock();
 	RamAllocLock::Unlock();
 	NKern::ThreadLeaveCS();
 
@@ -2094,6 +2229,43 @@
 	}
 
 
+TUint RequiredOldestPages(TUint aPagesToClean, TBool aCleanInSequence)
+	{
+	return aCleanInSequence ? aPagesToClean * 8 : aPagesToClean;
+	}
+
+
+void DPager::SetPagesToClean(TUint aPagesToClean)
+	{
+	TRACE(("WDP: Pager will attempt to clean %d pages", aPagesToClean));
+	__NK_ASSERT_ALWAYS(aPagesToClean > 0 && aPagesToClean <= KMaxPagesToClean);
+	MmuLock::Lock();
+	iPagesToClean = aPagesToClean;
+	iMaxOldestPages = MaxU(KDefaultMaxOldestPages,
+						   RequiredOldestPages(iPagesToClean, iCleanInSequence));
+	MmuLock::Unlock();
+	TRACE(("WDP: Maximum %d oldest pages", iMaxOldestPages));	
+	}
+
+
+TUint DPager::PagesToClean()
+	{
+	return iPagesToClean;
+	}
+
+
+void DPager::SetCleanInSequence(TBool aCleanInSequence)
+	{
+	TRACE(("WDP: Sequential page colour set to %d", aCleanInSequence));
+	MmuLock::Lock();
+	iCleanInSequence = aCleanInSequence;
+	iMaxOldestPages = MaxU(KDefaultMaxOldestPages,
+						   RequiredOldestPages(iPagesToClean, iCleanInSequence));
+	MmuLock::Unlock();	
+	TRACE(("WDP: Maximum %d oldest pages", iMaxOldestPages));
+	}
+
+
 // WARNING THIS METHOD MAY HOLD THE RAM ALLOC LOCK FOR EXCESSIVE PERIODS.  DON'T USE THIS IN ANY PRODUCTION CODE.
 void DPager::FlushAll()
 	{
@@ -2145,13 +2317,13 @@
 		}
 	while(piMap<piMapEnd);
 	MmuLock::Unlock();
+	PageCleaningLock::Unlock();
 
 	// reduce live page list to a minimum
 	while(GetFreePages(1)) {}; 
 
 	TRACE(("DPager::FlushAll() end with young=%d old=%d min=%d free=%d max=%d",iYoungCount,iOldCount,iMinimumPageCount,iNumberOfFreePages,iMaximumPageCount));
 
-	PageCleaningLock::Unlock();
 	RamAllocLock::Unlock();
 	NKern::ThreadLeaveCS();
 	}
@@ -2436,6 +2608,43 @@
 		return KErrNone;
 #endif
 
+	case EVMHalGetPhysicalAccessSupported:
+		if ((K::MemModelAttributes & EMemModelAttrDataPaging) == 0)
+			return KErrNotSupported;
+		return GetPhysicalAccessSupported();
+		
+	case EVMHalGetUsePhysicalAccess:
+		if ((K::MemModelAttributes & EMemModelAttrDataPaging) == 0)
+			return KErrNotSupported;
+		return GetUsePhysicalAccess();
+
+	case EVMHalSetUsePhysicalAccess:
+		if(!TheCurrentThread->HasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by VMHalFunction(EVMHalSetUsePhysicalAccess)")))
+			K::UnlockedPlatformSecurityPanic();
+		if ((K::MemModelAttributes & EMemModelAttrDataPaging) == 0)
+			return KErrNotSupported;
+		if ((TUint)a1 > 1)
+			return KErrArgument;
+		SetUsePhysicalAccess((TBool)a1);
+		return KErrNone;
+		
+	case EVMHalGetPreferredDataWriteSize:
+		if ((K::MemModelAttributes & EMemModelAttrDataPaging) == 0)
+			return KErrNotSupported;
+		return GetPreferredDataWriteSize();
+		
+	case EVMHalGetDataWriteSize:
+		if ((K::MemModelAttributes & EMemModelAttrDataPaging) == 0)
+			return KErrNotSupported;
+		return __e32_find_ms1_32(ThePager.PagesToClean());
+		
+	case EVMHalSetDataWriteSize:
+		if(!TheCurrentThread->HasCapability(ECapabilityWriteDeviceData,__PLATSEC_DIAGNOSTIC_STRING("Checked by VMHalFunction(EVMHalSetDataWriteSize)")))
+			K::UnlockedPlatformSecurityPanic();
+		if ((K::MemModelAttributes & EMemModelAttrDataPaging) == 0)
+			return KErrNotSupported;
+		return SetDataWriteSize((TUint)a1);
+	
 	default:
 		return KErrNotSupported;
 		}
@@ -2488,151 +2697,45 @@
 //
 
 //
-// DPagingRequest
+// DPagingRequestBase
 //
 
-DPagingRequest::DPagingRequest()
-	: iMutex(NULL), iUseRegionCount(0)
-	{
-	}
-
-
-void DPagingRequest::SetUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
-	{
-	__ASSERT_SYSTEM_LOCK;
-	__NK_ASSERT_DEBUG(iUseRegionCount == 0);
-	__NK_ASSERT_DEBUG(aCount > 0 && aCount <= EMaxPages);
-	for (TUint i = 0 ; i < aCount ; ++i)
-		{
-		iUseRegionMemory[i] = aMemory;
-		iUseRegionIndex[i] = aIndex + i;		
-		}
-	iUseRegionCount = aCount;
-	}
-
-
-void DPagingRequest::SetUseDiscontiguous(DMemoryObject** aMemory, TUint* aIndex, TUint aCount)
-	{
-	__ASSERT_SYSTEM_LOCK;
-	__NK_ASSERT_DEBUG(iUseRegionCount == 0);
-	__NK_ASSERT_DEBUG(aCount > 0 && aCount <= EMaxPages);
-	for (TUint i = 0 ; i < aCount ; ++i)
-		{
-		iUseRegionMemory[i] = aMemory[i];
-		iUseRegionIndex[i] = aIndex[i];
-		}
-	iUseRegionCount = aCount;
-	}
-
-
-void DPagingRequest::ResetUse()
-	{
-	__ASSERT_SYSTEM_LOCK;
-	__NK_ASSERT_DEBUG(iUseRegionCount > 0);
-	iUseRegionCount = 0;
-	}
-
-
-TBool DPagingRequest::CheckUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
-	{
-	if (iUseRegionCount != aCount)
-		return EFalse;
-	for (TUint i = 0 ; i < iUseRegionCount ; ++i)
-		{
-		if (iUseRegionMemory[i] != aMemory || iUseRegionIndex[i] != aIndex + i)
-			return EFalse;
-		}
-	return ETrue;
-	}
-
-
-TBool DPagingRequest::CheckUseDiscontiguous(DMemoryObject** aMemory, TUint* aIndex, TUint aCount)
-	{
-	if (iUseRegionCount != aCount)
-		return EFalse;
-	for (TUint i = 0 ; i < iUseRegionCount ; ++i)
-		{
-		if (iUseRegionMemory[i] != aMemory[i] || iUseRegionIndex[i] != aIndex[i])
-			return EFalse;
-		}
-	return ETrue;
-	}
-
-
- TBool DPagingRequest::IsCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
-	{
-	// note this could be optimised as most of the time we will be checking read/read collusions,
-	// both of which will be contiguous
-	__ASSERT_SYSTEM_LOCK;
-	for (TUint i = 0 ; i < iUseRegionCount ; ++i)
-		{
-		if (iUseRegionMemory[i] == aMemory &&
-			TUint(iUseRegionIndex[i] - aIndex) < aCount)
-			return ETrue;
-		}
-	return EFalse;
-	}
-
-
-TLinAddr DPagingRequest::MapPages(TUint aColour, TUint aCount, TPhysAddr* aPages)
+
+TLinAddr DPagingRequestBase::MapPages(TUint aColour, TUint aCount, TPhysAddr* aPages)
 	{
 	__NK_ASSERT_DEBUG(iMutex->iCleanup.iThread == &Kern::CurrentThread());
 	return iTempMapping.Map(aPages,aCount,aColour);
 	}
 
 
-void DPagingRequest::UnmapPages(TBool aIMBRequired)
+void DPagingRequestBase::UnmapPages(TBool aIMBRequired)
 	{
 	__NK_ASSERT_DEBUG(iMutex->iCleanup.iThread == &Kern::CurrentThread());
 	iTempMapping.Unmap(aIMBRequired);
 	}
 
-//
-// DPoolPagingRequest
-//
-
-DPoolPagingRequest::DPoolPagingRequest(DPagingRequestPool::TGroup& aPoolGroup) :
-	iPoolGroup(aPoolGroup)
-	{
-	}
-
-
-void DPoolPagingRequest::Release()
-	{
-	NKern::LockSystem();
-	ResetUse();
-	Signal();
-	}
-
-
-void DPoolPagingRequest::Wait()
-	{
-	__ASSERT_SYSTEM_LOCK;
-	++iUsageCount;
-	TInt r = iMutex->Wait();
-	__NK_ASSERT_ALWAYS(r == KErrNone);
-	}
-
-
-void DPoolPagingRequest::Signal()
-	{
-	__ASSERT_SYSTEM_LOCK;
-	iPoolGroup.Signal(this);
-	}
 
 //
 // DPageReadRequest
 //
 
+
 TInt DPageReadRequest::iAllocNext = 0;
 
+
+TUint DPageReadRequest::ReservedPagesRequired()
+	{
+	return iAllocNext*EMaxPages;
+	}
+
+
 DPageReadRequest::DPageReadRequest(DPagingRequestPool::TGroup& aPoolGroup) :
-	DPoolPagingRequest(aPoolGroup)
+	iPoolGroup(aPoolGroup)
 	{
-	// allocate space for mapping pages whilst they're being loaded...
 	iTempMapping.Alloc(EMaxPages);
 	}
 
+
 TInt DPageReadRequest::Construct()
 	{
 	// allocate id and mutex...
@@ -2666,6 +2769,65 @@
 	}
 
 
+void DPageReadRequest::Release()
+	{
+	NKern::LockSystem();
+	ResetUse();
+	Signal();
+	}
+
+
+void DPageReadRequest::Wait()
+	{
+	__ASSERT_SYSTEM_LOCK;
+	++iUsageCount;
+	TInt r = iMutex->Wait();
+	__NK_ASSERT_ALWAYS(r == KErrNone);
+	}
+
+
+void DPageReadRequest::Signal()
+	{
+	__ASSERT_SYSTEM_LOCK;
+	__NK_ASSERT_DEBUG(iUsageCount > 0);
+	if (--iUsageCount == 0)
+		iPoolGroup.iFreeList.AddHead(&iLink);
+	iMutex->Signal();
+	}
+
+
+void DPageReadRequest::SetUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+	{
+	__ASSERT_SYSTEM_LOCK;
+	__NK_ASSERT_DEBUG(aMemory != NULL && aCount <= EMaxPages);
+	__NK_ASSERT_DEBUG(iMemory == NULL);
+	iMemory = aMemory;
+	iIndex = aIndex;
+	iCount = aCount;
+	}
+
+
+void DPageReadRequest::ResetUse()
+	{
+	__ASSERT_SYSTEM_LOCK;
+	__NK_ASSERT_DEBUG(iMemory != NULL);
+	iMemory = NULL;
+	}
+
+
+ TBool DPageReadRequest::IsCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+	{
+	__ASSERT_SYSTEM_LOCK;
+	return iMemory == aMemory && aIndex < iIndex + iCount && aIndex + aCount > iIndex;
+	}
+
+
+TBool DPageReadRequest::CheckUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+	{
+	return iMemory == aMemory && iIndex == aIndex && iCount == aCount;
+	}
+
+
 //
 // DPageWriteRequest
 //
@@ -2674,8 +2836,7 @@
 DPageWriteRequest::DPageWriteRequest()
 	{
 	iMutex = ThePageCleaningLock;
-	// allocate space for mapping pages whilst they're being loaded...
-	iTempMapping.Alloc(KMaxPagesToClean);
+	iTempMapping.Alloc(EMaxPages);
 	}
 
 
@@ -2687,6 +2848,55 @@
 	}
 
 
+void DPageWriteRequest::SetUseDiscontiguous(DMemoryObject** aMemory, TUint* aIndex, TUint aCount)
+	{
+	__ASSERT_SYSTEM_LOCK;
+	__NK_ASSERT_DEBUG(iUseRegionCount == 0);
+	__NK_ASSERT_DEBUG(aCount > 0 && aCount <= EMaxPages);
+	for (TUint i = 0 ; i < aCount ; ++i)
+		{
+		iUseRegionMemory[i] = aMemory[i];
+		iUseRegionIndex[i] = aIndex[i];
+		}
+	iUseRegionCount = aCount;
+	}
+
+
+void DPageWriteRequest::ResetUse()
+	{
+	__ASSERT_SYSTEM_LOCK;
+	__NK_ASSERT_DEBUG(iUseRegionCount > 0);
+	iUseRegionCount = 0;
+	}
+
+
+TBool DPageWriteRequest::CheckUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+	{
+	if (iUseRegionCount != aCount)
+		return EFalse;
+	for (TUint i = 0 ; i < iUseRegionCount ; ++i)
+		{
+		if (iUseRegionMemory[i] != aMemory || iUseRegionIndex[i] != aIndex + i)
+			return EFalse;
+		}
+	return ETrue;
+	}
+
+
+ TBool DPageWriteRequest::IsCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+	{
+	// note this could be optimised as most of the time we will be checking read/read collusions,
+	// both of which will be contiguous
+	__ASSERT_SYSTEM_LOCK;
+	for (TUint i = 0 ; i < iUseRegionCount ; ++i)
+		{
+		if (iUseRegionMemory[i] == aMemory &&
+			TUint(iUseRegionIndex[i] - aIndex) < aCount)
+			return ETrue;
+		}
+	return EFalse;
+	}
+
 //
 // DPagingRequestPool
 //
@@ -2702,7 +2912,7 @@
 		TInt r = req->Construct();
 		__NK_ASSERT_ALWAYS(r==KErrNone);
 		iPageReadRequests.iRequests[i] = req;
-		iPageReadRequests.iFreeList.Add(req);
+		iPageReadRequests.iFreeList.Add(&req->iLink);
 		}
 
 	if (aWriteRequest)
@@ -2723,7 +2933,7 @@
 	{
 	NKern::LockSystem();
 
-	DPoolPagingRequest* req;
+	DPageReadRequest* req;
 	
 	// check for collision with existing write
 	if(iPageWriteRequest && iPageWriteRequest->IsCollisionContiguous(aMemory,aIndex,aCount))
@@ -2784,19 +2994,19 @@
 DPagingRequestPool::TGroup::TGroup(TUint aNumRequests)
 	{
 	iNumRequests = aNumRequests;
-	iRequests = new DPoolPagingRequest*[aNumRequests];
+	iRequests = new DPageReadRequest*[aNumRequests];
 	__NK_ASSERT_ALWAYS(iRequests);
 	}
 
 
-DPoolPagingRequest* DPagingRequestPool::TGroup::FindCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+DPageReadRequest* DPagingRequestPool::TGroup::FindCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
 	{
 	__ASSERT_SYSTEM_LOCK;
-	DPoolPagingRequest** ptr = iRequests;
-	DPoolPagingRequest** ptrEnd = ptr+iNumRequests;
+	DPageReadRequest** ptr = iRequests;
+	DPageReadRequest** ptrEnd = ptr+iNumRequests;
 	while(ptr<ptrEnd)
 		{
-		DPoolPagingRequest* req = *ptr++;
+		DPageReadRequest* req = *ptr++;
 		if(req->IsCollisionContiguous(aMemory,aIndex,aCount))
 			return req;
 		}
@@ -2806,20 +3016,21 @@
 
 static TUint32 RandomSeed = 33333;
 
-DPoolPagingRequest* DPagingRequestPool::TGroup::GetRequest(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
+DPageReadRequest* DPagingRequestPool::TGroup::GetRequest(DMemoryObject* aMemory, TUint aIndex, TUint aCount)
 	{
 	__NK_ASSERT_DEBUG(iNumRequests > 0);
 
 	// try using an existing request which collides with this region...
-	DPoolPagingRequest* req  = FindCollisionContiguous(aMemory,aIndex,aCount);
+	DPageReadRequest* req  = FindCollisionContiguous(aMemory,aIndex,aCount);
 	if(!req)
 		{
 		// use a free request...
-		req = (DPoolPagingRequest*)iFreeList.GetFirst();
-		if(req)
+		SDblQueLink* first = iFreeList.GetFirst();
+		if(first)
 			{
 			// free requests aren't being used...
-			__NK_ASSERT_DEBUG(req->iUsageCount == 0);
+			req = _LOFF(first, DPageReadRequest, iLink);
+			__NK_ASSERT_DEBUG(req->ThreadsWaiting() == 0);
 			}
 		else
 			{
@@ -2827,7 +3038,7 @@
 			RandomSeed = RandomSeed*69069+1; // next 'random' number
 			TUint index = (TUint64(RandomSeed) * TUint64(iNumRequests)) >> 32;
 			req = iRequests[index];
-			__NK_ASSERT_DEBUG(req->iUsageCount > 0); // we only pick random when none are free
+			__NK_ASSERT_DEBUG(req->ThreadsWaiting() > 0); // we only pick random when none are free
 			}
 		}
 
@@ -2838,17 +3049,6 @@
 	}
 
 
-void DPagingRequestPool::TGroup::Signal(DPoolPagingRequest* aRequest)
-	{
-	// if there are no threads waiting on the mutex then return it to the free pool...
-	__NK_ASSERT_DEBUG(aRequest->iUsageCount > 0);
-	if (--aRequest->iUsageCount==0)
-		iFreeList.AddHead(aRequest);
-
-	aRequest->iMutex->Signal();
-	}
-
-
 /**
 Register the specified paging device with the kernel.
 
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mpager.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mpager.h	Tue Jul 06 15:50:07 2010 +0300
@@ -26,8 +26,11 @@
 
 /**
 Maximum number of pages to attempt to clean in one go.
+
+If a paging device sets a preferred write size greater than this then it will fail to install with
+KErrArgument.
 */
-const TInt KMaxPagesToClean = 4;
+const TUint KMaxPagesToClean = 16;
 
 struct SVMCacheInfo;
 class DMemModelThread;
@@ -348,15 +351,17 @@
 	
 	@param aOldPageInfo	The page info of the page to discard.
 	@param aBlockZoneId	The ID of the RAM zone not to allocate any required new page into.
-	@param aBlockRest	Set to ETrue when we don't want the allocator to search for new pages if the RAM 
-						zone with ID==aBlockZoneId is encountered, i.e. a general RAM defrag operation.
+	@param aMoveDisFlags 	Flags that control the discarding of the page, should be a mask of 
+							values from M::TMoveDiscardFlags
 	*/
-	TInt DiscardPage(SPageInfo* aOldPageInfo, TUint aBlockZoneId, TBool aBlockRest);
+	TInt DiscardPage(SPageInfo* aOldPageInfo, TUint aBlockZoneId, TUint aMoveDisFlags);
 
 	/**
 	Attempt to discard the specified page and then allocate a page of type aPageType
 	in its place.
 	
+	Note - This will always attempt to move dirty pages rather than write them to swap.
+	
 	@param aPageInfo	The page info of the page to discard.
 	@param aPageType 	The new page type to allocate into aPageInfo's physical address.
 	*/
@@ -385,6 +390,34 @@
 	*/
 	void FreePinReplacementPages(TUint aNumPages);
 
+	//
+	// following public members for use by DDataPagedMemoryManager...
+	//
+	
+	/**
+	Called by the data paged memory manager to set the number of pages the pager should attempt to
+	clean at once.
+
+	This also adjusts the maximum size of the oldest list if it is too small to contain the
+	specified number of pages.
+
+	@param aPagesToClean     Number of pages the pager should attempt to clean in one go
+	*/
+	void SetPagesToClean(TUint aPagesToClean);
+
+	/**
+	Get the number of pages the pager attempts to clean at once.
+	*/
+	TUint PagesToClean();
+
+	/**
+	Called by the data paged memory manager to set whether pages cleaned must have sequential page
+	colour.
+
+	@param aCleanInSequence  Whether pages must have sequential page colour
+	*/
+	void SetCleanInSequence(TBool aCleanInSequence);
+
 private:
 	/**
 	Add a page to the head of the live page list. I.e. make it the 'youngest' page.
@@ -413,9 +446,20 @@
 	void RemovePage(SPageInfo* aPageInfo);
 
 	/**
-	Try to remove the oldest page from the live page list and perform #StealPage.
+	Get a page, either by stealing one from the live list or allocating one from the system.
+
+	
+	
+	If the oldest page is an oldest dirty page, this may attempt to clean multiple pages by calling
+	#CleanSomePages.
 
-	@param aPageInfoOut Set to the SPageInfo pointer for the stolen page if any.
+	If the oldest page is on any other list (i.e. is an old or young page) this will steal it,
+	aquiring the page cleaning mutex first if it is dirty.
+
+	Called from #PageInAllocPage, #TryReturnOldestPageToSystem, #AllowAddFreePage and 
+	#AllowAddFreePages.
+	
+	@param aAllowAlloc Indicates whether the method should try to allocate a page from the system
 	
 	@return KErrNone on success, KErrInUse if stealing failed or 1 to indicate the the oldest page
 	was dirty and the PageCleaning mutex was not held.
@@ -423,15 +467,7 @@
 	@pre MmuLock held
 	@post MmuLock left unchanged.
 	*/
-	TInt TryStealOldestPage(SPageInfo*& aPageInfoOut);
-
-	/**
-	Remove the oldest page from the live page list and perform #StealPage.
-
-	@pre MmuLock held
-	@post MmuLock held (but may have been released by this function)
-	*/
-	SPageInfo* StealOldestPage();
+	SPageInfo* StealOrAllocPage(TBool aAllowAlloc, Mmu::TRamAllocFlags aAllocFlags);
 
 	/**
 	Steal a page from the memory object (if any) which is using the page.
@@ -479,9 +515,32 @@
 
 	@pre RamAllocLock held.
 	*/
-	void ReturnPageToSystem();
+	TBool TryReturnOldestPageToSystem();
+
+	/**
+	Ensure adding a page to the paging cache will be within the maximum size.
+	
+	@param aPageInfo	On return this is set to the SPageInfo of a page that must be returned
+						to the system before a page can be added to the paging cache, or
+						NULL if no page must be returned to the system.
+	*/
+	void AllowAddFreePage(SPageInfo*& aPageInfo);
 
 	/**
+	Ensure adding aNumPages pages to the paging cache will be within the maximum size.
+	
+	@param aPageInfo	On return this is set to the SPageInfo of a page that must be returned
+						to the system before any more pages can be added to the paging cache, or
+						NULL if no page must be returned to the system.
+	@param aNumPages	The number of pages the caller wishes to add to the paging cache.
+	
+	@return If aPageInfo == NULL on return, this is the number of pages it is possible to
+			add to the paging cache or 1 if aPageInfo != NULL, i.e. a page will need 
+			to be returned to the system.
+	*/
+	TUint AllowAddFreePages(SPageInfo*& aPageInfo, TUint aNumPages);
+	
+	/**
 	Put a specific page back on the system's free pool.
 
 	@pre RamAllocLock held.
@@ -498,11 +557,11 @@
 	SPageInfo* PageInAllocPage(Mmu::TRamAllocFlags aAllocFlags);
 
 	/**
-	Called by CleanSomePages() to determine which pages should be cleaned.
+	Called by CleanSomePages() to select the pages be cleaned.
 
-	This deals with the complexity of page colouring, which means that pages can only be mapped at
-	certain locations.  When cleaning multiple pages at once we need to find a set of pages that we
-	can map in memory sequentially.
+	This function finds a set of pages that can be mapped sequentially in memory when page colouring
+	restrictions are in effect.  It is only called on systems with page colouring restrictions where
+	the paging media driver does not support writing by phyiscal address.
 
 	@pre MmuLock held
 	
@@ -511,7 +570,22 @@
 	
 	@return The numnber of pages to clean.
 	*/
-	TInt SelectPagesToClean(SPageInfo** aPageInfosOut);
+	TInt SelectSequentialPagesToClean(SPageInfo** aPageInfosOut);
+
+	/**
+	Called by CleanSomePages() to select the pages be cleaned.
+
+	This funciton selects the oldest dirty pages.  It is called on systems without page colouring
+	restrictions or where the paging media driver supports writing by phyiscal address.
+
+	@pre MmuLock held
+	
+	@param aPageInfosOut Pointer to an array of SPageInfo pointers, which must be at least
+	KMaxPagesToClean long.  This will be filled in to indicate the pages to clean.
+	
+	@return The numnber of pages to clean.
+	*/
+	TInt SelectOldestPagesToClean(SPageInfo** aPageInfosOut);
 
 	/**
 	If the number of young pages exceeds that specified by iYoungOldRatio then a
@@ -587,6 +661,7 @@
 	*/
 	TInt PteAndInfoFromLinAddr(	TInt aOsAsid, TLinAddr aAddress, DMemoryMappingBase* aMapping, 
 								TUint aMapInstanceCount, TPte*& aPte, SPageInfo*& aPageInfo);
+	
 #ifdef _DEBUG
 	/**
 	Check consistency of live list.
@@ -612,6 +687,7 @@
 	SDblQue iOldestDirtyList;	/**< Head of 'oldestDirty' page list. */
 	TUint iOldestDirtyCount;	/**< Number of 'oldestDirty' pages */
 	TUint16 iOldOldestRatio;	/**< Ratio of old pages to oldest to clean and dirty in the live page list*/
+	TUint iMaxOldestPages;      /**< Maximum number of oldest pages. */
 	TUint iNumberOfFreePages;
 	TUint iNumberOfDirtyPages;	/**< The total number of dirty pages in the paging cache. Protected by MmuLock */
 	TUint iInitMinimumPageCount;/**< Initial value for iMinimumPageCount */
@@ -619,6 +695,9 @@
 	TUint iReservePageCount;	/**< Number of pages reserved for locking */
 	TUint iMinimumPageLimit;	/**< Minimum size for iMinimumPageCount, not including locked pages.
 								     iMinimumPageCount >= iMinimumPageLimit + iReservePageCount */
+	TUint iPagesToClean;        /**< Preferred number of pages to attempt to clean in one go. */
+	TBool iCleanInSequence;     /**< Pages to be cleaned must have sequential page colour. */
+
 	SVMEventInfo iEventInfo;
 
 #ifdef __DEMAND_PAGING_BENCHMARKS__
@@ -786,7 +865,6 @@
 const TInt KPagingRequestsPerDevice = 2;
 
 
-class DPoolPagingRequest;
 class DPageReadRequest;
 class DPageWriteRequest;
 
@@ -806,110 +884,98 @@
 		{
 	public:
 		TGroup(TUint aNumRequests);
-		DPoolPagingRequest* FindCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
-		DPoolPagingRequest* GetRequest(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
-		void Signal(DPoolPagingRequest* aRequest);
+		DPageReadRequest* FindCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
+		DPageReadRequest* GetRequest(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
 	public:
 		TUint iNumRequests;
-		DPoolPagingRequest** iRequests;
+		DPageReadRequest** iRequests;
 		SDblQue iFreeList;
 		};
 	TGroup iPageReadRequests;
 	DPageWriteRequest* iPageWriteRequest;
 
-	friend class DPoolPagingRequest;
 	friend class DPageReadRequest;
-	friend class DPageWriteRequest;
 	};
 
 
 /**
-Resources needed to service a paging request.
+Common resources needed to service a paging request.
 */
-class DPagingRequest : public SDblQueLink
+class DPagingRequestBase : public DBase
 	{
 public:
+	TLinAddr MapPages(TUint aColour, TUint aCount, TPhysAddr* aPages);
+	void UnmapPages(TBool aIMBRequired);
+public:  // for DPagingRequestPool
+	DMutex*			iMutex;		/**< A mutex for synchronisation and priority inheritance. */
+protected:
+	Mmu::TTempMapping	iTempMapping;
+	};
+
+
+/**
+Resources needed to service a page in request.
+*/
+class DPageReadRequest : public DPagingRequestBase
+	{
+public:
+	static TUint ReservedPagesRequired();
+private:
+	static TInt iAllocNext;
+
+public:
 	enum
 		{
 		EMaxPages = 4
 		};
-	DPagingRequest();
-	TLinAddr MapPages(TUint aColour, TUint aCount, TPhysAddr* aPages);
-	void UnmapPages(TBool aIMBRequired);
-	void SetUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
-	void SetUseDiscontiguous(DMemoryObject** aMemory, TUint* aIndex, TUint aCount);
-	void ResetUse();
-	TBool CheckUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
-	TBool CheckUseDiscontiguous(DMemoryObject** aMemory, TUint* aIndex, TUint aCount);
-	TBool IsCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
-public:
-	DMutex*			iMutex;		/**< A mutex for synchronisation and priority inheritance. */
-protected:
-	Mmu::TTempMapping	iTempMapping;
-private:
-	// used to identify memory request is used for...
-	TUint			iUseRegionCount;
-	DMemoryObject*	iUseRegionMemory[EMaxPages];
-	TUint			iUseRegionIndex[EMaxPages];
-	};
-
-
-__ASSERT_COMPILE(DPagingRequest::EMaxPages >= KMaxPagesToClean);
-
-
-/**
-A paging request that is part of a pool of similar request objects.
-*/
-class DPoolPagingRequest : public DPagingRequest
-	{
-public:
-	DPoolPagingRequest(DPagingRequestPool::TGroup& aPoolGroup);
+	DPageReadRequest(DPagingRequestPool::TGroup& aPoolGroup);
+	TInt Construct();
  	void Release();
 	void Wait();
 	void Signal();
-public:
-	TInt			iUsageCount;	/**< How many threads are using or waiting for this object. */	
+	void SetUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
+	void ResetUse();
+	TBool CheckUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
+	TBool IsCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
+	TLinAddr Buffer() { return iBuffer; }
+	TUint ThreadsWaiting() { return iUsageCount; }
 private:
+	~DPageReadRequest() { }  // can't delete
+public:  // for DPagingRequestPool
+	SDblQueLink iLink;  /**< Link into list of free requests. */
+private:
+	TInt iUsageCount;	/**< How many threads are using or waiting for this object. */	
+	TLinAddr iBuffer;	/**< A buffer of size EMaxPages+1 pages to read compressed data into. */
 	DPagingRequestPool::TGroup& iPoolGroup;
+	DMemoryObject* iMemory;
+	TUint iIndex;
+	TUint iCount;
 	};
 
-	
-/**
-Resources needed to service a page in request.
-*/
-class DPageReadRequest : public DPoolPagingRequest
-	{
-public:
-	DPageReadRequest(DPagingRequestPool::TGroup& aPoolGroup);
-	TInt Construct();
-	static TUint ReservedPagesRequired();
-private:
-	~DPageReadRequest(); // can't delete
-public:
-	TLinAddr		iBuffer;	/**< A buffer to read compressed data into. Size is EMaxPages+1 pages.*/
-private:
-	DMemoryObject*	iMemory;
-private:
-	static TInt iAllocNext;
-	};
-
-
-FORCE_INLINE TUint DPageReadRequest::ReservedPagesRequired()
-	{
-	return iAllocNext*EMaxPages;
-	}
-
 
 /**
 Resources needed to service a page out request.
 */
-class DPageWriteRequest : public DPagingRequest
+class DPageWriteRequest : public DPagingRequestBase
 	{
 public:
+	enum
+		{
+		EMaxPages = KMaxPagesToClean
+		};
 	DPageWriteRequest();
  	void Release();
+	void SetUseDiscontiguous(DMemoryObject** aMemory, TUint* aIndex, TUint aCount);
+	void ResetUse();
+	TBool CheckUseContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
+	TBool IsCollisionContiguous(DMemoryObject* aMemory, TUint aIndex, TUint aCount);
 private:
-	~DPageWriteRequest(); // can't delete
+	~DPageWriteRequest() { }  // can't delete	
+private:
+	// used to identify the memory the request is used for...
+	TUint			iUseRegionCount;
+	DMemoryObject*	iUseRegionMemory[EMaxPages];
+	TUint			iUseRegionIndex[EMaxPages];
 	};
 
 
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mptalloc.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mptalloc.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -118,6 +118,8 @@
 
 	virtual TInt MovePage(	DMemoryObject* aMemory, SPageInfo* aOldPageInfo, 
 							TPhysAddr& aNewPage, TUint aBlockZoneId, TBool aBlockRest);
+
+	virtual TInt MoveAndAllocPage(DMemoryObject* aMemory, SPageInfo* aPageInfo, TZonePageType aType);
 public:
 	/**
 	Allocate a page of RAM for storing page tables in.
@@ -263,13 +265,22 @@
 	return r;
 	}
 
+
 TInt DPageTableMemoryManager::MovePage(	DMemoryObject* aMemory, SPageInfo* aOldPageInfo, 
 										TPhysAddr& aNewPage, TUint aBlockZoneId, TBool aBlockRest)
-		{
-		// This could be a demand paged page table info which can be discarded 
-		// but let the PageTableAllocator handle that.
-		return ::PageTables.MovePage(aMemory, aOldPageInfo, aBlockZoneId, aBlockRest);
-		}
+	{
+	// This could be a demand paged page table info which can be discarded 
+	// but let the PageTableAllocator handle that.
+	return ::PageTables.MovePage(aMemory, aOldPageInfo, aBlockZoneId, aBlockRest);
+	}
+
+
+TInt DPageTableMemoryManager::MoveAndAllocPage(DMemoryObject* aMemory, SPageInfo* aPageInfo, TZonePageType aPageType)
+	{
+	// This could be a demand paged page table info which can be discarded 
+	// but let the PageTableAllocator handle that.
+	return ::PageTables.MoveAndAllocPage(aMemory, aPageInfo, aPageType);
+	}
 
 
 //
@@ -1177,9 +1188,9 @@
 TInt PageTableAllocator::MovePage(DMemoryObject* aMemory, SPageInfo* aOldPageInfo, 
 									TUint aBlockZoneId, TBool aBlockRest)
 	{
+	__NK_ASSERT_DEBUG(MmuLock::IsHeld());
 	// We don't move page table or page table info pages, however, if this page 
 	// is demand paged then we may be able to discard it.
-	MmuLock::Lock();
 	if (aOldPageInfo->Owner() == iPageTableInfoMemory)
 		{
 		if (!(iPtPageAllocator.IsDemandPagedPtInfo(aOldPageInfo)))
@@ -1206,7 +1217,19 @@
 	// Let the pager discard the page as it controls the size of the live list.
 	// If the size of the live list allows then eventually 
 	// PageTableAllocator::StealPage() will be invoked on this page.
-	return ThePager.DiscardPage(aOldPageInfo, aBlockZoneId, aBlockRest);
+	TUint moveDisFlags = (aBlockRest)? M::EMoveDisBlockRest : 0;
+	return ThePager.DiscardPage(aOldPageInfo, aBlockZoneId, moveDisFlags);
+	}
+
+
+TInt PageTableAllocator::MoveAndAllocPage(DMemoryObject* aMemory, SPageInfo* aPageInfo, TZonePageType aPageType)
+	{
+	TInt r = MovePage(aMemory, aPageInfo, KRamZoneInvalidId, EFalse);
+	if (r == KErrNone)
+		{
+		TheMmu.MarkPageAllocated(aPageInfo->PhysAddr(), aPageType);
+		}
+	return r;
 	}
 
 
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mptalloc.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mptalloc.h	Tue Jul 06 15:50:07 2010 +0300
@@ -137,6 +137,17 @@
 	TInt MovePage(	DMemoryObject* aMemory, SPageInfo* aOldPageInfo, 
 						TUint aBlockZoneId, TBool aBlockRest);
 
+	/**
+	Attempts to discard a page of page tables using #MovePage.  If the discard was 
+	succesful it then allocates the page with type aPageType.
+	
+	@param aMemory		This should always be the page table info memory object.
+	@param aPageInfo	The page info of the page to discard.
+
+	@return KErrNone if the page could be successfully discarded and its RAM page allocated.
+	*/
+	TInt MoveAndAllocPage(DMemoryObject* aMemory, SPageInfo* aPageInfo, TZonePageType aPageType);
+
 #ifdef _DEBUG
 	/**
 	Debug function for use by DPager::RemovePage() to allow it to remove
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mrom.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mrom.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -576,7 +576,7 @@
 				__NK_ASSERT_ALWAYS(romPageInfo->iPagingAttributes & SRomPageInfo::EPageable);
 
 				// Read data for page...
-				const TLinAddr buffer = aRequest->iBuffer;
+				const TLinAddr buffer = aRequest->Buffer();
 				const TUint readStart = dataOffset >> readUnitShift;
 				const TUint readSize = ((dataOffset + dataSize - 1) >> readUnitShift) - readStart + 1;
 				__NK_ASSERT_DEBUG((readSize << readUnitShift) <= (DPageReadRequest::EMaxPages << KPageShift));
@@ -958,7 +958,11 @@
 	RamAllocLock::Lock();
 
 	Mmu& m = TheMmu;
-	r = m.AllocRam(&iNewPage, 1, aMemory->RamAllocFlags(), EPageFixed);
+	// Allocate a page to shadow to allowing the allocation to steal pages from the paging cache.
+	r = m.AllocRam(	&iNewPage, 
+					1, 
+					(Mmu::TRamAllocFlags)(aMemory->RamAllocFlags() & ~Mmu::EAllocNoPagerReclaim), 
+					EPageFixed);
 	if(r==KErrNone)
 		{
 		TLinAddr dst = m.MapTemp(iNewPage,aIndex,0);
--- a/kernel/eka/memmodel/epoc/flexible/mmu/mswap.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mswap.h	Tue Jul 06 15:50:07 2010 +0300
@@ -23,5 +23,10 @@
 
 extern void GetSwapInfo(SVMSwapInfo& aInfoOut);
 extern TInt SetSwapThresholds(const SVMSwapThresholds& aThresholds);
+extern TBool GetPhysicalAccessSupported();
+extern TBool GetUsePhysicalAccess();
+extern void SetUsePhysicalAccess(TBool aUsePhysicalAccess);
+extern TUint GetPreferredDataWriteSize();
+extern TInt SetDataWriteSize(TUint aWriteShift);
 
 #endif
--- a/kernel/eka/memmodel/epoc/mmubase/defragbase.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/mmubase/defragbase.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -78,6 +78,7 @@
 	TUint offset = 0;
 	TPhysAddr newAddr;
 	TBool zoneActive = EFalse;
+	const TUint moveDisFlags = (aBestEffort)? 0 : M::EMoveDisBlockRest | M::EMoveDisMoveDirty;
 	TInt ret = iRamAllocator->NextAllocatedPage(&aZone, offset, EPageMovable);
 
 	// if not best effort mode keep moving pages unless someone allocates into 
@@ -101,7 +102,7 @@
 			__KTRACE_OPT(KMMU, Kern::Printf("ClearMovableFromZone: memory too low or zone active addr %x", addr));
 			return KErrNoMemory;
 			}
-		TInt moved = M::MovePage(addr, newAddr, aZone.iId, !aBestEffort);
+		TInt moved = M::MovePage(addr, newAddr, aZone.iId, moveDisFlags);
 		if (moved != KErrNone)
 			{// Couldn't move the page so stop as we can't clear the zone
 			if (!aBestEffort)
@@ -144,6 +145,7 @@
 	TUint offset = 0;
 	TBool zoneActive = EFalse;
 	TInt ret = iRamAllocator->NextAllocatedPage(&aZone, offset, EPageDiscard);
+	const TUint moveDisFlags = (aBestEffort)? 0 : M::EMoveDisBlockRest | M::EMoveDisMoveDirty;
 
 
 	while (	aZone.iAllocPages[EPageDiscard] != 0 && ret == KErrNone && 
@@ -169,7 +171,7 @@
 			return KErrNoMemory;
 			}
 
-		TInt discardRet = M::DiscardPage(addr, aZone.iId, !aBestEffort);
+		TInt discardRet = M::DiscardPage(addr, aZone.iId, moveDisFlags);
 		if (discardRet == KErrNone)
 			{// Page was discarded successfully.
 			if (aMaxDiscard)
--- a/kernel/eka/memmodel/epoc/mmubase/mmubase.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/mmubase/mmubase.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -5523,7 +5523,7 @@
 		}
 
 	MmuBase::Wait();
-	TInt r=M::MovePage(aOld,aNew,KRamZoneInvalidId,EFalse);
+	TInt r=M::MovePage(aOld,aNew,KRamZoneInvalidId,0);
 	if (r!=KErrNone)
 		aNew = KPhysAddrInvalid;
 	MmuBase::Signal();
--- a/kernel/eka/memmodel/epoc/mmubase/ramalloc.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/memmodel/epoc/mmubase/ramalloc.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -1330,26 +1330,37 @@
 		Kern::Printf("ZoneClearPages: ID 0x%x, req 0x%x", aZone.iId, aRequiredPages));
 	// Discard the required number of discardable pages.
 	TUint offset = 0;
-	TInt r = NextAllocatedPage(&aZone, offset, EPageDiscard);
-	while (r == KErrNone && aRequiredPages)
+	for (; aRequiredPages; offset++)
 		{
+		TInt r = NextAllocatedPage(&aZone, offset, EPageDiscard);
+		if (r != KErrNone)
+			break;
+		if (iContiguousReserved && aZone.iBma[EPageFixed]->NotFree(offset, 1))
+			{
+			offset++;
+			continue;
+			}
 		TPhysAddr physAddr = (offset << KPageShift) + aZone.iPhysBase;
-		TInt discarded = M::DiscardPage(physAddr, aZone.iId, EFalse);
+		TInt discarded = M::DiscardPage(physAddr, aZone.iId, M::EMoveDisMoveDirty);
 		if (discarded == KErrNone)
 			{// The page was successfully discarded.
 			aRequiredPages--;
 			}
-		offset++;
-		r = NextAllocatedPage(&aZone, offset, EPageDiscard);
 		}
 	// Move the required number of movable pages.
-	offset = 0;
-	r = NextAllocatedPage(&aZone, offset, EPageMovable);
-	while(r == KErrNone && aRequiredPages)
+	for (offset = 0; aRequiredPages; offset++)
 		{
+		TInt r = NextAllocatedPage(&aZone, offset, EPageMovable);
+		if (r != KErrNone)
+			break;
+		if (iContiguousReserved && aZone.iBma[EPageFixed]->NotFree(offset, 1))
+			{
+			offset++;
+			continue;
+			}
 		TPhysAddr physAddr = (offset << KPageShift) + aZone.iPhysBase;
 		TPhysAddr newAddr = KPhysAddrInvalid;
-		if (M::MovePage(physAddr, newAddr, aZone.iId, EFalse) == KErrNone)
+		if (M::MovePage(physAddr, newAddr, aZone.iId, 0) == KErrNone)
 			{// The page was successfully moved.
 #ifdef _DEBUG
 			TInt newOffset = 0;
@@ -1358,8 +1369,6 @@
 #endif
 			aRequiredPages--;
 			}
-		offset++;
-		r = NextAllocatedPage(&aZone, offset, EPageMovable);
 		}
 	}
 
@@ -1441,14 +1450,15 @@
 	TPhysAddr* pageListBase = aPageList;
 	TUint32 numMissing = aNumPages;
 
+	if ((TUint)aNumPages > iTotalFreeRamPages)
+		{// Not enough free pages to fulfill this request so return the amount required
+		return aNumPages - iTotalFreeRamPages;
+		}
+
 	if (aType == EPageFixed)
 		{// Currently only a general defrag operation should set this and it won't
 		// allocate fixed pages.
 		__NK_ASSERT_DEBUG(!aBlockRest);
-		if ((TUint)aNumPages > iTotalFreeRamPages + M::NumberOfFreeDpPages())
-			{// Not enough free space and not enough freeable pages.
-			goto exit;
-			}
 
 		// Search through each zone in preference order until all pages allocated or
 		// have reached the end of the preference list
@@ -1484,11 +1494,6 @@
 		}
 	else
 		{
-		if ((TUint)aNumPages > iTotalFreeRamPages)
-			{// Not enough free pages to fulfill this request so return amount required
-			return aNumPages - iTotalFreeRamPages;
-			}
-
 		// Determine if there are enough free pages in the RAM zones in use.
 		TUint totalFreeInUse = 0;
 		SDblQueLink* link = iZoneLeastMovDis;
@@ -1725,7 +1730,7 @@
 
 
 #if !defined(__MEMMODEL_MULTIPLE__) && !defined(__MEMMODEL_MOVING__)
-void DRamAllocator::BlockContiguousRegion(TPhysAddr aAddrBase, TUint aNumPages)
+TUint DRamAllocator::BlockContiguousRegion(TPhysAddr aAddrBase, TUint aNumPages)
 	{
 	// Shouldn't be asked to block zero pages, addrEndPage would be wrong if we did.
 	__NK_ASSERT_DEBUG(aNumPages);
@@ -1734,6 +1739,7 @@
 	TInt tmpOffset;
 	SZone* endZone = GetZoneAndOffset(addrEndPage, tmpOffset);
 	SZone* tmpZone;
+	TUint totalUnreserved = aNumPages;
 	do
 		{
 		tmpZone = GetZoneAndOffset(addr, tmpOffset);
@@ -1754,11 +1760,13 @@
 #endif
 			ZoneAllocPages(tmpZone, reserved, EPageFixed);
 			iTotalFreeRamPages -= reserved;
+			totalUnreserved -= reserved;
 			}
 		tmpZone->iBma[EPageFixed]->Alloc(tmpOffset, runLength);
 		addr = tmpZone->iPhysEnd + 1;
 		}
 	while (tmpZone != endZone);
+	return totalUnreserved;
 	}
 
 
@@ -1834,13 +1842,43 @@
 	}
 
 
-TBool DRamAllocator::ClearContiguousRegion(TPhysAddr aAddrBase, TPhysAddr aZoneBase, TUint aNumPages, TInt& aOffset)
+TUint DRamAllocator::CountPagesInRun(TPhysAddr aAddrBase, TPhysAddr aAddrEndPage, TZonePageType aType)
+	{
+	__NK_ASSERT_DEBUG(aAddrBase <= aAddrEndPage);
+	TUint totalAllocated = 0;
+	TPhysAddr addr = aAddrBase;
+	TUint tmpOffset;
+	SZone* endZone = GetZoneAndOffset(aAddrEndPage, (TInt&)tmpOffset);
+	SZone* tmpZone;
+	do
+		{
+		tmpZone = GetZoneAndOffset(addr, (TInt&)tmpOffset);
+		__NK_ASSERT_DEBUG(tmpZone != NULL);
+		TUint runLength = 	(aAddrEndPage < tmpZone->iPhysEnd)? 
+							((aAddrEndPage - addr) >> KPageShift) + 1: 
+							tmpZone->iPhysPages - tmpOffset;
+		TUint runEnd = tmpOffset + runLength - 1;
+		while (tmpOffset <= runEnd)
+			{
+			TUint run = NextAllocatedRun(tmpZone, tmpOffset, runEnd, aType);
+			totalAllocated += run;
+			tmpOffset += run;
+			}
+		addr = tmpZone->iPhysEnd + 1;
+		}
+	while (tmpZone != endZone);
+	return totalAllocated;
+	}
+
+
+TInt DRamAllocator::ClearContiguousRegion(TPhysAddr aAddrBase, TPhysAddr aZoneBase, TUint aNumPages, TInt& aOffset, TUint aUnreservedPages)
 	{
 	TPhysAddr addr = aAddrBase;
-	TPhysAddr addrEnd = aAddrBase + (aNumPages << KPageShift);
+	TPhysAddr addrEndPage = aAddrBase + ((aNumPages -1 )<< KPageShift);
 	TInt contigOffset = 0;
 	SZone* contigZone = GetZoneAndOffset(addr, contigOffset);
-	for (; addr != addrEnd; addr += KPageSize, contigOffset++)
+	TUint unreservedPages = aUnreservedPages;
+	for (; addr <= addrEndPage; addr += KPageSize, contigOffset++)
 		{
 		if (contigZone->iPhysEnd < addr)
 			{
@@ -1852,17 +1890,41 @@
 		__NK_ASSERT_DEBUG(contigZone->iBma[EPageFixed]->NotFree(contigOffset, 1));
 		__NK_ASSERT_DEBUG(SPageInfo::SafeFromPhysAddr(addr) != NULL);
 
-		// WARNING - This may flash the ram alloc mutex.
-		TInt exRet = M::MoveAndAllocPage(addr, EPageFixed);
-		if (exRet != KErrNone)
+		if (unreservedPages > iTotalFreeRamPages)
+			{// May need to discard some pages so there is free space for the 
+			// pages in the contiguous run to be moved to.
+			TUint requiredPages = unreservedPages - iTotalFreeRamPages;
+			if (requiredPages)
+				{// Ask the pager to get free some pages.
+				M::GetFreePages(requiredPages);
+
+				// The ram alloc lock may have been flashed so ensure that we still have
+				// enough free ram to complete the allocation.
+				TUint remainingPages = ((addrEndPage - addr) >> KPageShift) + 1;
+				unreservedPages = remainingPages - CountPagesInRun(addr, addrEndPage, EPageFixed);
+				if (unreservedPages > iTotalFreeRamPages + M::NumberOfFreeDpPages())
+					{// Not enough free space and not enough freeable pages.
+					return KErrNoMemory;
+					}
+				}
+			}
+
+		TInt r = M::MoveAndAllocPage(addr, EPageFixed);
+		if (r != KErrNone)
 			{// This page couldn't be moved or discarded so 
 			// restart the search the page after this one.
-			__KTRACE_OPT(KMMU2, Kern::Printf("ContigMov fail contigOffset 0x%x exRet %d", contigOffset, exRet));
+			__KTRACE_OPT(KMMU2, Kern::Printf("ContigMov fail contigOffset 0x%x r %d", contigOffset, r));
 			aOffset = (addr < aZoneBase)? 0 : contigOffset + 1;
-			break;
+			return r;
 			}
+		__NK_ASSERT_DEBUG(contigZone->iBma[EPageFixed]->NotFree(contigOffset, 1));
+		__NK_ASSERT_DEBUG(contigZone->iBma[KBmaAllPages]->NotFree(contigOffset, 1));
+		__NK_ASSERT_DEBUG(contigZone->iBma[EPageDiscard]->NotAllocated(contigOffset, 1));
+		__NK_ASSERT_DEBUG(contigZone->iBma[EPageMovable]->NotAllocated(contigOffset, 1));
 		}
-	return addr == addrEnd;
+
+	// Successfully cleared the contiguous run
+	return KErrNone;
 	}
 
 
@@ -1889,6 +1951,13 @@
 		{// Not enough free space and not enough freeable pages.
 		return KErrNoMemory;
 		}
+	if (aNumPages > iTotalFreeRamPages)
+		{// Need to discard some pages so there is free space for the pages in 
+		// the contiguous run to be moved to.
+		TUint requiredPages = aNumPages - iTotalFreeRamPages;
+		if (!M::GetFreePages(requiredPages))
+			return KErrNoMemory;
+		}
 
 	TInt alignWrtPage = Max(aAlign - KPageShift, 0);
 	TUint32 alignmask = (1u << alignWrtPage) - 1;
@@ -1950,8 +2019,9 @@
 				
 				// Block the contiguous region from being allocated.
 				iContiguousReserved++;
-				BlockContiguousRegion(addrBase, aNumPages);
-				if (ClearContiguousRegion(addrBase, zone->iPhysBase, aNumPages, offset))
+				TUint unreservedPages = BlockContiguousRegion(addrBase, aNumPages);
+				TInt clearRet = ClearContiguousRegion(addrBase, zone->iPhysBase, aNumPages, offset, unreservedPages);
+				if (clearRet == KErrNone)
 					{// Cleared all the required pages.
 					// Return address of physical page at the start of the region.
 					iContiguousReserved--;
@@ -1977,6 +2047,11 @@
 					carryImmov = 0;
 					carryAll = 0;
 					__KTRACE_OPT(KMMU2, Kern::Printf("<AllocContigfail run 0x%08x - 0x%08x 0x%x", addrBase, addrBase + (aNumPages << KPageShift), TheCurrentThread));
+					if (clearRet == KErrNoMemory)
+						{// There are no longer enough free or discardable pages to 
+						// be able to fulfill this allocation.
+						return KErrNoMemory;
+						}
 					}
 				}
 			}
@@ -2099,7 +2174,7 @@
 						__NK_ASSERT_DEBUG(SPageInfo::SafeFromPhysAddr(addr) != NULL);
 
 						TPhysAddr newAddr;
-						TInt moveRet = M::MovePage(addr, newAddr, contigZone->iId, EFalse);
+						TInt moveRet = M::MovePage(addr, newAddr, contigZone->iId, 0);
 						if (moveRet != KErrNone && moveRet != KErrNotFound)
 							{// This page couldn't be moved or discarded so 
 							// restart the search the page after this one.
@@ -2462,8 +2537,7 @@
 				page in the zone should be found, on return it will be the offset 
 				of the next allocated page.
 @param aEndOffset The last offset within this RAM zone to check for allocated runs.
-@return The length of any run found, KErrNotFound if no more pages in
-the zone after aOffset are allocated, KErrArgument if aOffset is outside the zone.
+@return The length of any run found.
 */
 TInt DRamAllocator::NextAllocatedRun(SZone* aZone, TUint& aOffset, TUint aEndOffset, TZonePageType aType) const
 	{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/nkern/arm/nklib.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,194 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\nkern\arm\nklib.cia
+// 
+//
+
+#include <e32atomics.h>
+#include <nklib.h>
+
+#ifdef __SRATIO_MACHINE_CODED__
+__NAKED__ void SRatio::Set(TUint32 /*aInt*/, TInt /*aDivisorExp*/)
+	{
+#ifdef __CPU_ARM_HAS_CLZ
+	CLZ(		3,1);						// r3=31-MSB(r1), 32 if r1=0
+	asm("add	r2, r2, r3 ");				// r2=shift+aDivisorExp
+	asm("movs	r1, r1, lsl r3 ");			// shift r1 left so bit 31=1
+	asm("rsb	r2, r2, #0 ");				// r2 = -shift-aDivisorExp
+	asm("moveq	r2, #0 ");					// if aInt=0, r2=0
+	asm("bicne	r2, r2, #0xff000000 ");		// else clear iSpare fields
+	asm("bicne	r2, r2, #0x00ff0000 ");		//
+#else
+	asm("rsb	r2, r2, #0 ");				// r2 = -aDivisorExp
+	asm("cmp	r1, #0x00010000 ");			// if aInt top 16 bits clear ...
+	asm("movcc	r1, r1, lsl #16 ");			// ... shift 16 bits left ...
+	asm("subcc	r2, r2, #16 ");				// ... and subtract 16 from iX
+	asm("cmp	r1, #0x01000000 ");
+	asm("movcc	r1, r1, lsl #8 ");
+	asm("subcc	r2, r2, #8 ");
+	asm("cmp	r1, #0x10000000 ");
+	asm("movcc	r1, r1, lsl #4 ");
+	asm("subcc	r2, r2, #4 ");
+	asm("cmp	r1, #0x40000000 ");
+	asm("movcc	r1, r1, lsl #2 ");
+	asm("subcc	r2, r2, #2 ");
+	asm("cmp	r1, #0x80000000 ");
+	asm("subcc	r2, r2, #1 ");
+	asm("cmp	r1, #0 ");
+	asm("moveq	r2, #0 ");					// if aInt=0, r2=0
+	asm("bicne	r2, r2, #0xff000000 ");		// else clear iSpare fields
+	asm("bicne	r2, r2, #0x00ff0000 ");		//
+#endif
+	asm("stmia	r0, {r1,r2} ");				// iM in r1, iX in bottom 16 bits of r2
+	__JUMP(,	lr);
+	}
+
+__NAKED__ TInt SRatio::Reciprocal()
+	{
+	asm("ldr	r1, [r0] ");				// r1 = iM
+	asm("ldrsh	r12, [r0, #4] ");			// r12 = iX
+	asm("rsbs	r2, r1, #0 ");
+	asm("beq	0f ");						// divide by zero
+	asm("add	r12, r12, #63 ");
+	asm("rsb	r12, r12, #0 ");			// r12 = -63 - iX
+	asm("addvs	r12, r12, #1 ");			// if iM==0x80000000 r12 = -62 - iX (ratio = 2^(31+iX) so reciprocal = 2^(-31-iX) = 2^(31 + (-62-iX))
+	asm("bvs	1f ");						// iM=0x80000000
+
+	// 2^(32+iX) > r > 2^(31+iX)
+	// 2^(-32-iX) < 1/r < 2^(-31-iX)
+	// 2^(31+(-63-iX)) < 1/r < 2^(31+(-62-iX))
+	asm("mov	r2, #0 ");					// accumulates result
+	asm("mov	r3, #0x80000000 ");			// 33 bit accumulator in C:R3 initialised to 2^32
+	asm("2:		");
+	asm("adds	r3, r3, r3 ");
+	asm("cmpcc	r3, r1 ");
+	asm("subcs	r3, r3, r1 ");				// if C=1 or r3>=r1, r3-=r1
+	asm("adcs	r2, r2, r2 ");				// next result bit
+	asm("bcc	2b ");						// finished when we have 33 bits (when top bit shifted off)
+	asm("movs	r2, r2, lsr #1 ");			// rounding bit into C
+	asm("orr	r2, r2, #0x80000000 ");		// top bit back
+	asm("adcs	r2, r2, #0 ");				// add rounding bit
+	asm("movcs	r2, #0x80000000 ");			// if carry, increment exponent
+	asm("addcs	r12, r12, #1 ");
+
+	asm("1:		");
+	asm("cmp	r12, #-32768 ");
+	asm("blt	9f ");						// underflow
+	asm("cmp	r12, #32768 ");
+	asm("bge	8f ");						// overflow
+	asm("str	r2, [r0] ");				// iM
+	asm("strh	r12, [r0, #4] ");			// iX
+	asm("mov	r0, #0 ");
+	__JUMP(,	lr);
+
+	asm("0:		");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrDivideByZero));
+	__JUMP(,	lr);
+
+	asm("8:		");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrOverflow));
+	__JUMP(,	lr);
+
+	asm("9:		");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrUnderflow));
+	__JUMP(,	lr);
+	}
+
+__NAKED__ TInt SRatio::Mult(TUint32& /*aInt32*/)
+	{
+	asm("ldr	r3, [r0] ");				// r3 = iM
+	asm("mov	r12, r0 ");
+	asm("ldr	r0, [r1] ");				// r0 = aInt32
+	asm("cmp	r3, #0 ");
+	asm("cmpne	r0, #0 ");
+	asm("beq	0f ");						// result zero
+	asm("umull	r2, r3, r0, r3 ");			// r3:r2 = aInt32 * iM (lowest value 0x0000000080000000)
+	asm("ldrsh	r12, [r12, #4] ");			// r12 = iX
+#ifdef __CPU_ARM_HAS_CLZ
+	CLZ(		0, 3);						// r0 = number of leading zeros in r3:r2 (can't be >32)
+#else
+	asm("str	r12, [sp, #-4]! ");
+	asm("movs	r12, r3 ");
+	asm("mov	r0, #0 ");
+	asm("cmp	r12, #0x00010000 ");
+	asm("movcc	r12, r12, lsl #16 ");
+	asm("addcc	r0, r0, #16 ");
+	asm("cmp	r12, #0x01000000 ");
+	asm("movcc	r12, r12, lsl #8 ");
+	asm("addcc	r0, r0, #8 ");
+	asm("cmp	r12, #0x10000000 ");
+	asm("movcc	r12, r12, lsl #4 ");
+	asm("addcc	r0, r0, #4 ");
+	asm("cmp	r12, #0x40000000 ");
+	asm("movcc	r12, r12, lsl #2 ");
+	asm("addcc	r0, r0, #2 ");
+	asm("cmp	r12, #0 ");
+	asm("ldr	r12, [sp], #4 ");			// r12 = iX
+	asm("addgt	r0, r0, #1 ");
+	asm("moveq	r0, #32 ");					// r0 = number of leading zeros in r3:r2 (can't be >32)
+#endif
+	asm("rsb	r0, r0, #63 ");				// bit number of most significant bit
+	asm("add	r0, r0, r12 ");				// bit number of most significant bit after exponent shift
+	asm("cmp	r0, #32 ");
+	asm("bge	8f ");						// overflow
+	asm("cmp	r0, #-1 ");
+	asm("blt	9f ");						// underflow
+	asm("adds	r12, r12, #32 ");			// shift needed to get result into top 32 bits (>0 left, <0 right)
+	asm("beq	1f ");						// no shift
+	asm("blt	2f ");						// right shift
+	asm("rsb	r0, r12, #32 ");
+	asm("mov	r3, r3, lsl r12 ");
+	asm("orr	r3, r3, r2, lsr r0 ");
+	asm("mov	r2, r2, lsl r12 ");			// r3:r2 <<= r12
+	asm("b		1f ");
+	asm("2:		");
+	asm("rsb	r12, r12, #0 ");
+	asm("rsb	r0, r12, #32 ");
+	asm("mov	r2, r2, lsr r12 ");
+	asm("orr	r2, r2, r3, lsl r0 ");
+	asm("mov	r3, r3, lsr r12 ");			// r3:r2 >>= r12
+	asm("1:		");
+	asm("adds	r2, r2, r2 ");				// rounding
+	asm("adcs	r3, r3, #0 ");
+	asm("bcs	8f ");						// overflow
+	asm("beq	9f ");						// underflow
+	asm("mov	r0, #0 ");
+	asm("str	r3, [r1] ");
+	__JUMP(,	lr);
+
+	asm("0:		");
+	asm("mov	r0, #0 ");
+	asm("str	r0, [r1] ");
+	__JUMP(,	lr);
+
+	asm("8:		");
+	asm("mvn	r0, #0 ");
+	asm("str	r0, [r1] ");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrOverflow));
+	__JUMP(,	lr);
+
+	asm("9:		");
+	asm("mov	r0, #0 ");
+	asm("str	r0, [r1] ");
+	asm("mov	r0, #%a0" : : "i" ((TInt)KErrUnderflow));
+	__JUMP(,	lr);
+	}
+
+//TInt SRatio::Mult(TUint64& aInt64)
+//	{
+//	}
+
+#endif
+
+
--- a/kernel/eka/nkern/nkern.mmp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkern/nkern.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -16,12 +16,13 @@
 //
 
 sourcepath				../nkern
-source					nkern.cpp
+source					nkern.cpp nklib.cpp
 #ifdef MARM
 sourcepath				../common/arm
 source					atomics.cia
 sourcepath				../nkern/arm
 source					vectors.cia ncsched.cpp ncsched.cia nctimer.cia ncutilf.cia
+source					nklib.cia
 
 // X86
 #elif defined(X86)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/nkern/nklib.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,135 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\nkern\nklib.cpp
+// 
+//
+
+#include <e32atomics.h>
+#include <nklib.h>
+
+#ifndef __SRATIO_MACHINE_CODED__
+void SRatio::Set(TUint32 aInt, TInt aDivisorExp)
+	{
+	iSpare1 = 0;
+	iSpare2 = 0;
+	iM = aInt;
+	if (iM)
+		{
+		TInt ms1 = __e32_find_ms1_32(iM);
+		TInt shift = 31 - ms1;
+		iM <<= shift;
+		iX = (TInt16)(-shift - aDivisorExp);
+		}
+	else
+		iX = 0;
+	}
+
+TInt SRatio::Reciprocal()
+	{
+	if (iM==0)
+		return KErrDivideByZero;
+	// Calculate 2^32/iM
+	TInt exp=0;
+	if (iM == 0x80000000u)
+		{
+		// ratio = 2^(31+iX) so reciprocal = 2^(-31-iX) = 2^(31 + (-62-iX))
+		exp = -62-iX;
+		}
+	else
+		{
+		// 2^32/iM = 1.xxx
+		TUint64 r64 = MAKE_TUINT64(0u-iM,0);
+		TUint32 q32 = (TUint32)(r64/TUint64(iM));	// next 32 bits of result
+		iM = 0x80000000u | (q32>>1);
+		exp = -63-iX;
+		if (q32 & 1)
+			{
+			if (++iM==0)
+				iM=0x80000000u, ++exp;
+			}
+		}
+	if (exp < -32768)
+		{
+		iM = 0;
+		iX = 0;
+		return KErrUnderflow;
+		}
+	if (exp > 32767)
+		{
+		iM = 0xffffffffu;
+		iX = 32767;
+		return KErrOverflow;
+		}
+	iX = (TInt16)exp;
+	return KErrNone;
+	}
+
+TInt SRatio::Mult(TUint32& aInt32)
+	{
+	TUint64 x = aInt32;
+	x *= TUint64(iM);
+	if (x==0)
+		{
+		aInt32 = 0;
+		return KErrNone;
+		}
+	TInt ms1 = __e32_find_ms1_64(x);
+	TInt ms1b = ms1 + iX;
+	if (ms1b>=32)
+		{
+		aInt32 = ~0u;
+		return KErrOverflow;
+		}
+	if (ms1b<-1)
+		{
+		aInt32 = 0;
+		return KErrUnderflow;
+		}
+	TInt shift = ms1b - ms1 + 31;
+	if (shift > 0)
+		x <<= shift;
+	else if (shift < 0)
+		x >>= (-shift);
+	x += MAKE_TUINT64(0,0x40000000u);
+	if (x >> 63)
+		{
+		aInt32 = ~0u;
+		return KErrOverflow;
+		}
+	aInt32 = (TUint32)(x>>31);
+	return aInt32 ? KErrNone : KErrUnderflow;
+	}
+
+//TInt SRatio::Mult(TUint64& aInt64)
+//	{
+//	}
+#endif
+
+void SRatioInv::Set(const SRatio* a)
+	{
+	if (a)
+		{
+		iR = *a;
+		iI = iR;
+		iI.Reciprocal();
+		}
+	else
+		{
+		iR.Set(1);
+		iI.Set(1);
+		}
+	}
+
+
+
--- a/kernel/eka/nkernsmp/arm/nccpu.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/nccpu.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -20,9 +20,6 @@
 #include <arm_scu.h>
 #include <arm_tmr.h>
 
-extern "C" {
-extern SVariantInterfaceBlock* VIB;
-}
 
 struct SAPBootPage : public SFullArmRegSet
 	{
@@ -94,7 +91,7 @@
 
 	KickCpu(&bootPage.iAPBootPtr[a.iCpu], bp_phys);
 
-	TUint32 n = TUint32(VIB->iMaxCpuClock >> 3);
+	TUint32 n = TUint32(TheScheduler.iVIB->iMaxCpuClock >> 3);
 	n = -n;
 	TUint32 b = 0;
 	do	{
--- a/kernel/eka/nkernsmp/arm/ncglob.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncglob.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -33,8 +33,6 @@
 //TSubScheduler*	SubSchedulerLookupTable[256];
 TUint32 CrashStateOut;
 SFullArmRegSet DefaultRegSet;
-
-SVariantInterfaceBlock* VIB;
 }
 
 #ifdef __USE_BTRACE_LOCK__
--- a/kernel/eka/nkernsmp/arm/ncmonitor.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncmonitor.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -43,22 +43,20 @@
 	m.Printf("i_ScuAddr  %08x i_GicDist  %08x i_GicCpuIf %08x i_LocTmrA  %08x\r\n", x.iScuAddr, x.iGicDistAddr, x.iGicCpuIfcAddr, x.iLocalTimerAddr);
 	m.Printf("i_IrqCount %08x i_IrqNest  %08x i_ExcInfo  %08x i_CrashSt  %08x\r\n", x.iIrqCount, x.iIrqNestCount, x.iExcInfo, x.iCrashState);
 	m.Printf("i_AbtStkTp %08x i_UndSktTp %08x i_FiqStkTp %08x i_IrqStkTp %08x\r\n", x.iAbtStackTop, x.iUndStackTop, x.iFiqStackTop, x.iIrqStackTop);
-	m.Printf("CpuFreqM   %08x CpuFreqS   %08x CpuPeriodM %08x CpuPeriodS %08x\r\n", x.iCpuFreqM, x.iCpuFreqS, x.iCpuPeriodM, x.iCpuPeriodS);
-	m.Printf("NTmrFreqM  %08x NTmrFreqS  %08x NTmPeriodM %08x NTmPeriodS %08x\r\n", x.iNTimerFreqM, x.iNTimerFreqS, x.iNTimerPeriodM, x.iNTimerPeriodS);
-	m.Printf("TmrFreqM   %08x TmrFreqS   %08x TmrPeriodM %08x TmrPeriodS %08x\r\n", x.iTimerFreqM, x.iTimerFreqS, x.iTimerPeriodM, x.iTimerPeriodS);
-	m.Printf("iLastSyncT %08x %08x            TicksSince %08x LastTmrSet %08x\r\n", I64HIGH(x.iLastSyncTime), I64LOW(x.iLastSyncTime), x.iTicksSinceLastSync, x.iLastTimerSet);
-	m.Printf("GapEstimat %08x GapCount   %08x TotalTicks %08x Ditherer   %08x\r\n", x.iGapEstimate, x.iGapCount, x.iTotalTicks, x.iDitherer);
-	m.Printf("FreqErrEst %08x FreqErrLim %08x ErrorInteg %08x %08x\r\n", x.iFreqErrorEstimate, x.iFreqErrorLimit, I64HIGH(x.iErrorIntegrator), I64LOW(x.iErrorIntegrator));
-	m.Printf("RefAtLastC %08x %08x            M=%02x N=%02x D=%02x\r\n", I64HIGH(x.iRefAtLastCorrection), I64LOW(x.iRefAtLastCorrection), x.iM, x.iN, x.iD);
+	m.Printf("CpuFreqM   %08x CpuFreqS   %08x CpuPeriodM %08x CpuPeriodS %08x\r\n", x.iCpuFreqRI.iR.iM, x.iCpuFreqRI.iR.iX, x.iCpuFreqRI.iI.iM, x.iCpuFreqRI.iI.iX);
+	m.Printf("TmrFreqM   %08x TmrFreqS   %08x TmrPeriodM %08x TmrPeriodS %08x\r\n", x.iTimerFreqRI.iR.iM, x.iTimerFreqRI.iR.iX, x.iTimerFreqRI.iI.iM, x.iTimerFreqRI.iI.iX);
 	}
 
 void DisplaySchedulerExt(Monitor& m, TScheduler& s)
 	{
-	volatile TUint32* sx = (volatile TUint32*)&s.iSX;
-	m.Printf("Extras  0: %08x  1: %08x  2: %08x  3: %08x\r\n",sx[0],sx[1],sx[2],sx[3]);
-	m.Printf("Extras  4: %08x  5: %08x  6: %08x  7: %08x\r\n",sx[4],sx[5],sx[6],sx[7]);
-	m.Printf("Extras  8: %08x  9: %08x  A: %08x  B: %08x\r\n",sx[8],sx[9],sx[10],sx[11]);
-	m.Printf("Extras  C: %08x  D: %08x  E: %08x  F: %08x\r\n",sx[12],sx[13],sx[14],sx[15]);
+	TSchedulerX& sx = s.iSX;
+	m.Printf("iTimerMax  %08x %08x\r\n", I64HIGH(sx.iTimerMax), I64LOW(sx.iTimerMax));
+	m.Printf("iGTmrA     %08x  iScuAddr %08x  iGicDistA %08x  iGicCpuIfcA %08x  iLocTmrA %08x\r\n",
+		sx.iGlobalTimerAddr, sx.iScuAddr, sx.iGicDistAddr, sx.iGicCpuIfcAddr, sx.iLocalTimerAddr);
+	m.Printf("iGTFreqM   %08x iGTFreqS   %08x iGTPeriodM %08x iGTPeriodS %08x\r\n",
+		sx.iGTimerFreqRI.iR.iM, sx.iGTimerFreqRI.iR.iX, sx.iGTimerFreqRI.iI.iM, sx.iGTimerFreqRI.iI.iX);
+	m.Printf("iCount0    %08x %08x   iTimestamp0 %08x %08x\r\n",
+		I64HIGH(sx.iCount0), I64LOW(sx.iCount0), I64HIGH(sx.iTimestamp0), I64LOW(sx.iTimestamp0));
 	}
 
 void DumpRegisters(Monitor& m, SFullArmRegSet& a)
--- a/kernel/eka/nkernsmp/arm/ncsched.cia	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncsched.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -949,15 +949,18 @@
 	asm("cmp	r12, #0 ");
 	asm("bne	0f ");					// initial (i.e. idle) thread, so skip
 	asm("ldr	r3, [r2, #%a0]" : : "i" _FOFF(ArmLocalTimer,iTimerCount));
-	asm("ldr	r12, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTimerPeriodM));
-	asm("ldr	r2, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTimerPeriodS));
+	asm("ldr	r12, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTimerFreqRI.iI.iM));
+	asm("ldr	r2, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTimerFreqRI.iI.iX));
 	asm("cmp	r3, #0 ");
 	asm("movmi	r0, #0 ");				// if timer count is negative, save zero
 	asm("bmi	1f ");
-	asm("umull	r0, r3, r12, r3 ");		// scale up to max timer clock (R3:R0)
+	asm("mov	r2, r2, lsl #16 ");
+	asm("mov	r2, r2, asr #16 ");
+	asm("umull	r0, r3, r12, r3 ");		// scale up to max timer clock (R3:R0) - need to shift right by -iX
+	asm("rsb	r2, r2, #0 ");
 	asm("rsb	r12, r2, #32 ");
-	asm("movs	r0, r0, lsr r2 ");		// r0 >>= iSSX.iTimerPeriodS, C = last bit shifted off (rounding)
-	asm("orr	r0, r0, r3, lsl r12 ");	// bottom bits from r12 into top bits of r0
+	asm("movs	r0, r0, lsr r2 ");		// r0 >>= iSSX.iTimerFreqRI.iI.iX, C = last bit shifted off (rounding)
+	asm("orr	r0, r0, r3, lsl r12 ");	// bottom bits from r3 into top bits of r0
 	asm("adcs	r0, r0, #0 ");			// round using last bit shifted off
 	asm("1:		");
 	asm("str	r0, [r1, #%a0]" : : "i" _FOFF(NThreadBase,iTime));
@@ -971,103 +974,7 @@
 #error Use of local timer for NKern::Timestamp() no longer supported
 #else
 
-/*	Update aOld's execution time and set up the timer for aNew
-	Update this CPU's timestamp value
-
-	if (!aOld) aOld=iInitialThread
-	if (!aNew) aNew=iInitialThread
-	newcount = aNew->iTime>0 ? Max(aNew->iTime*iSSX.iTimerFreqM/2^(32+iTimerFreqS), 1) : 2^31-1
-	cli()
-	oldcount = timer count
-	if (oldcount<=0 || aOld!=aNew)
-		{
-		timer count = newcount
-		iSSX.iLastTimerSet = newcount
-		if (aOld!=aNew)
-			{
-			TUint64 now = NKern::Timestamp();
-			elapsed = iLastTimestamp -= now;
-			iLastTimestamp = now;
-			aOld->iTotalCpuTime.i64 += elapsed;
-			if (!aOld->iActiveState)
-				aOld->iTotalActiveTime.i64 += (now - aOld->iLastActivationTime.i64);
-			++iReschedCount.i64;
-			++aNew->iRunCount.i64;
-			}
-		}
-	sti()
- */
-__NAKED__ void TSubScheduler::UpdateThreadTimes(NThreadBase* /*aOld*/, NThreadBase* /*aNew*/)
-	{
-	asm("cmp	r2, #0 ");
-	asm("ldreq	r2, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iInitialThread));
-	asm("ldr	r12, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTimerFreqM));
-	asm("cmp	r1, #0 ");
-	asm("ldreq	r1, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iInitialThread));
-	asm("ldr	r3, [r2, #%a0]" : : "i" _FOFF(NThreadBase,iTime));
-	asm("stmfd	sp!, {r4-r7} ");
-	asm("cmp	r1, r2 ");
-	asm("beq	2f ");
-	asm("ldr	r6, [r2, #%a0]" : : "i" _FOFF(NThreadBase,iRunCount.i32[0]));
-	asm("ldr	r7, [r2, #%a0]" : : "i" _FOFF(NThreadBase,iRunCount.i32[1]));
-	asm("adds	r6, r6, #1 ");
-	asm("str	r6, [r2, #%a0]" : : "i" _FOFF(NThreadBase,iRunCount.i32[0]));
-	asm("ldr	r4, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iReschedCount.i32[0]));
-	asm("ldr	r6, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iReschedCount.i32[1]));
-	asm("adcs	r7, r7, #0 ");
-	asm("str	r7, [r2, #%a0]" : : "i" _FOFF(NThreadBase,iRunCount.i32[1]));
-	asm("adds	r4, r4, #1 ");
-	asm("adcs	r6, r6, #0 ");
-	asm("str	r4, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iReschedCount.i32[0]));
-	asm("str	r6, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iReschedCount.i32[1]));
-	asm("2:		");
-	asm("ldr	r6, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iLocalTimerAddr));
-	asm("cmp	r3, #1 ");					// aNew->iTime > 0 ?
-	asm("movlt	r3, #0x7fffffff ");			// if not, use 2^31-1
-	asm("blt	3f ");
-	asm("cmp	r1, r2 ");					// different thread?
-	asm("beq	0f ");						// no - finish
-	asm("ldr	r5, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTimerFreqS));
-	asm("umull	r4, r3, r12, r3 ");			// r3:r4 = aNew->iTime * iTimerFreqM
-	asm("adds	r4, r4, r4 ");				// bit 31 into C
-	asm("teq	r5, #0 ");					// check for iTimerFreqS=0 without changing C
-	asm("movnes	r3, r3, lsr r5 ");			// if not, r3>>=iTimerFreqS, last bit shifted out into C
-	asm("adcs	r3, r3, #0 ");				// round using last bit shifted off
-	asm("3:		");
-	asm("str	r3, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iLastTimerSet));
-	asm("str	r3, [r6, #%a0]" : : "i" _FOFF(ArmLocalTimer,iTimerCount));	// set new timeslice value in timer
-
-	asm("ldr	r6, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iLastTimestamp.i32[0]));
-	asm("ldr	r7, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iLastTimestamp.i32[1]));
-	asm("stmfd	sp!, {r0-r2,lr} ");
-	asm("bl		Timestamp__5NKern ");		// R1:R0 = current time
-	asm("mov	r4, r0 ");
-	asm("mov	r5, r1 ");					// R5:R4 = current time
-	asm("ldmfd	sp!, {r0-r2,lr} ");
-	asm("str	r4, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iLastTimestamp.i32[0]));
-	asm("ldr	r3, [r1, #%a0]!" : : "i" _FOFF(NThreadBase,iTotalCpuTime.i64));
-	asm("ldr	r12, [r1, #4] ");
-	asm("str	r5, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,iLastTimestamp.i32[1]));
-	asm("stmdb	r1, {r4-r5} ");				// aOld->iLastRunTime
-	asm("ldrb	r2, [r1, #%a0]" : : "i" (_FOFF(NSchedulable,iActiveState)-_FOFF(NThreadBase,iTotalCpuTime.i64)));
-	asm("subs	r6, r4, r6 ");
-	asm("sbcs	r7, r5, r7 ");				// R7:R6 = time since last reschedule
-	asm("adds	r3, r3, r6 ");
-	asm("adcs	r12, r12, r7 ");			// total CPU time of old thread
-	asm("stmia	r1!, {r3,r12} ");			// store, r1=&aOld.iLastActivationTime
-	asm("cmp	r2, #0 ");					// old thread still active?
-	asm("bne	0f ");						// yes - done
-	asm("ldmia	r1!, {r2,r3,r6,r7} ");		// R3:R2 = last activation time, R7:R6=total active time
-	asm("subs	r2, r4, r2 ");
-	asm("sbcs	r3, r5, r3 ");				// R3:R2 = time since last activation
-	asm("adds	r6, r6, r2 ");
-	asm("adcs	r7, r7, r3 ");				// R7:R6 = new total active time
-	asm("stmdb	r1, {r6,r7} ");
-
-	asm("0:		");
-	asm("ldmfd	sp!, {r4-r7} ");
-	__JUMP(,lr);
-	}
+#error UpdateThreadTimes assembler out of date!
 
 #endif
 #endif	// __UTT_MACHINE_CODED__
--- a/kernel/eka/nkernsmp/arm/ncsched.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncsched.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -163,26 +163,32 @@
 #if !defined(__UTT_MACHINE_CODED__)
 void TSubScheduler::UpdateThreadTimes(NThreadBase* aOld, NThreadBase* aNew)
 	{
+	/* If necessary update local timer frequency (DVFS) */
+	SRatioInv* pNCF = iSSX.iNewCpuFreqRI;
+	if (pNCF)
+		{
+		iSSX.iCpuFreqRI = *pNCF;
+		__e32_atomic_store_rel_ptr(&iSSX.iNewCpuFreqRI, 0);
+		}
+	SRatioInv* pNTF = iSSX.iNewTimerFreqRI;
+	if (pNTF)
+		{
+		iSSX.iTimerFreqRI = *pNTF;
+		__e32_atomic_store_rel_ptr(&iSSX.iNewTimerFreqRI, 0);
+		}
 	if (!aOld)
 		aOld = iInitialThread;
 	if (!aNew)
 		aNew = iInitialThread;
-	if (aNew!=aOld || aNew->iTime<=0)
+	if (aNew!=aOld || aNew->iTime<=0 || pNTF)
 		{
 		TUint32 tmrval = 0x7fffffffu;
 		if (aNew->iTime > 0)
 			{
-			TUint64 x = TUint64(aNew->iTime) * TUint64(iSSX.iTimerFreqM);
-			tmrval = I64HIGH(x);
-			if (iSSX.iTimerFreqS)
-				{
-				tmrval += ((1u<<iSSX.iTimerFreqS)-1);
-				tmrval >>= iSSX.iTimerFreqS;
-				}
-			else if (I64LOW(x) & 0x80000000u)
-				++tmrval;
+			tmrval = aNew->iTime;	// this will have been computed based on the old timer frequency
+			iSSX.iTimerFreqRI.iR.Mult(tmrval);
 			}
-		iSSX.iLastTimerSet = tmrval;
+//		iSSX.iLastTimerSet = tmrval;
 		iSSX.iLocalTimerAddr->iTimerCount = tmrval;
 		}
 	if (aNew!=aOld)
--- a/kernel/eka/nkernsmp/arm/ncthrd.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncthrd.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -132,10 +132,32 @@
 		{
 		NKern::EnableAllInterrupts();
 
+#if defined(__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK) && defined(__NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+
+		if (cpu == 0) 
+			{
+			// start global timer if necessary
+			ArmGlobalTimer& GT = GLOBAL_TIMER;
+			if (!(GT.iTimerCtrl & E_ArmGTmrCtrl_TmrEnb))
+				{
+				// timer not currently enabled
+				GT.iTimerCtrl = 0;
+				__e32_io_completion_barrier();
+				GT.iTimerStatus = E_ArmGTmrStatus_Event;
+				__e32_io_completion_barrier();
+				GT.iTimerCountLow = 0;
+				GT.iTimerCountHigh = 0;
+				__e32_io_completion_barrier();
+				GT.iTimerCtrl = E_ArmGTmrCtrl_TmrEnb;	// enable timer with prescale factor of 1
+				__e32_io_completion_barrier();
+				}
+			}
+		
+#endif
+
 		// start local timer
 		ArmLocalTimer& T = LOCAL_TIMER;
 		T.iTimerCtrl = E_ArmTmrCtrl_IntEn | E_ArmTmrCtrl_Reload | E_ArmTmrCtrl_Enable;
-
 		// Initialise timestamp
 		InitTimestamp(ss, aInfo);
 		}
--- a/kernel/eka/nkernsmp/arm/ncutilf.cia	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncutilf.cia	Tue Jul 06 15:50:07 2010 +0300
@@ -20,9 +20,6 @@
 #include <arm_gic.h>
 #include <arm_tmr.h>
 
-extern "C" {
-extern SVariantInterfaceBlock* VIB;
-}
 
 __NAKED__ void Arm::GetUserSpAndLr(TAny*) 
 	{
@@ -304,11 +301,10 @@
 	asm("ldr	r3, __TheScheduler ");
 	asm("mrs	r12, cpsr ");				// r12 = saved interrupt mask
 	asm("stmfd	sp!, {r4-r7} ");
-	asm("ldr	r5, [r3, #%a0]" : : "i" _FOFF(TScheduler,iSub[0]));						// r5->subscheduler for CPU0
 	asm("ldr	r4, [r3, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGlobalTimerAddr));		// r4 points to global timer
 	__ASM_CLI();							// disable all interrupts
-	asm("ldr	r6, [r5, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iTicksSinceLastSync));	// r6 = count value of last frequency change (low)
-	asm("ldr	r7, [r5, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iLastTimerSet));		// r7 = count value of last frequency change (high)
+	asm("ldr	r6, [r3, #%a0]" : : "i" _FOFF(TScheduler,iSX.iCount0));					// r6 = count value of last frequency change (low)
+	asm("ldr	r7, [r3, #%a0]" : : "i" (_FOFF(TScheduler,iSX.iCount0)+4));				// r7 = count value of last frequency change (high)
 	asm("ldr	r2, [r4, #%a0]" : : "i" _FOFF(ArmGlobalTimer,iTimerCountHigh));			// r2 = current timer counter high word
 
 	// To read 64 bit timer value, read high, low, high
@@ -317,21 +313,23 @@
 	asm("mov	r1, r2 ");					// r1 = previous value of timer counter high word
 	asm("ldr	r0, [r4, #%a0]" : : "i" _FOFF(ArmGlobalTimer,iTimerCountLow));			// r0 = current timer counter low word
 	asm("ldr	r2, [r4, #%a0]" : : "i" _FOFF(ArmGlobalTimer,iTimerCountHigh));			// r2 = current timer counter high word
+	asm("mov	r5, r3 ");					// r5 = &TheScheduler
 	asm("cmp	r1, r2 ");					// high word changed?
 	asm("bne	1b ");						// if so, retry
 
 	// Now have R1:R0 = 64 bit global timer count
-	asm("ldr	r3, [r5, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iNTimerPeriodM));		// r3 = period multiplier
-	asm("ldr	r4, [r5, #%a0]" : : "i" _FOFF(TSubScheduler,iSSX.iNTimerPeriodS));		// r4 = period multiplier shift
+	asm("ldr	r3, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iI.iM));		// r3 = period multiplier
+	asm("ldrsh	r4, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iI.iX));		// r4 = period multiplier shift
 	asm("subs	r6, r0, r6 ");				// r7:r6 = ticks from last frequency change
 	asm("sbcs	r7, r1, r7 ");
 	asm("umull	r0, r1, r6, r3 ");
 	asm("mov	r2, #0 ");
 	asm("umlal	r1, r2, r7, r3 ");			// r2:r1:r0 = delta * period multiplier
-	asm("rsb	r3, r4, #32 ");
-	asm("ldr	r6, [r5, #%a0]!" : : "i" _FOFF(TSubScheduler,iSSX.iLastSyncTime));		// r6 = timestamp at last freq change (low)
+	asm("ldr	r6, [r5, #%a0]!" : : "i" _FOFF(TScheduler,iSX.iTimestamp0));			// r6 = timestamp at last freq change (low)
 	asm("ldr	r7, [r5, #4] ");														// r7 = timestamp at last freq change (high)
 	asm("msr	cpsr, r12 ");				// restore interrupts
+	asm("rsb	r4, r4, #0 ");
+	asm("rsb	r3, r4, #32 ");
 	asm("movs	r0, r0, lsr r4 ");			// rounding bit into C
 	asm("orr	r0, r0, r1, lsl r3 ");
 	asm("mov	r1, r1, lsr r4 ");
@@ -345,6 +343,58 @@
 	asm(".word	%a0" : : "i" ((TInt)&TheScheduler));
 	}
 
+// Compensate for a change of frequency of the clocking driving the ARM Global Timer
+// Call with interrupts disabled
+__NAKED__ void ArmGlobalTimerFreqChg(const SRatioInv* /*aNewGTimerFreqRI*/)
+	{
+	asm("ldr	r3, __TheScheduler ");
+	asm("stmfd	sp!, {r4-r7} ");
+	asm("ldr	r4, [r3, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGlobalTimerAddr));		// r4 points to global timer
+	asm("ldr	r6, [r3, #%a0]" : : "i" _FOFF(TScheduler,iSX.iCount0));					// r6 = count value of last frequency change (low)
+	asm("ldr	r7, [r3, #%a0]" : : "i" (_FOFF(TScheduler,iSX.iCount0)+4));				// r7 = count value of last frequency change (high)
+	asm("ldr	r12, [r4, #%a0]" : : "i" _FOFF(ArmGlobalTimer,iTimerCountHigh));		// r12 = current timer counter high word
+	asm("mov	r5, r3 ");					// r5 = &TheScheduler
+
+	// To read 64 bit timer value, read high, low, high
+	// If two high values match -> OK, else repeat
+	asm("1:		");
+	asm("mov	r3, r12 ");					// r3 = previous value of timer counter high word
+	asm("ldr	r2, [r4, #%a0]" : : "i" _FOFF(ArmGlobalTimer,iTimerCountLow));			// r0 = current timer counter low word
+	asm("ldr	r12, [r4, #%a0]" : : "i" _FOFF(ArmGlobalTimer,iTimerCountHigh));		// r12 = current timer counter high word
+	asm("cmp	r3, r12 ");					// high word changed?
+	asm("bne	1b ");						// if so, retry
+
+	// Now have R3:R2 = 64 bit global timer count
+	asm("str	r2, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iCount0));					// update count value at last frequency change
+	asm("str	r3, [r5, #%a0]" : : "i" (_FOFF(TScheduler,iSX.iCount0)+4));				// to be equal to current count value
+	asm("subs	r6, r2, r6 ");				// r7:r6 = ticks (at old frequency) from last frequency change
+	asm("sbcs	r7, r3, r7 ");
+	asm("ldr	r3, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iI.iM));		// r3 = old period multiplier
+	asm("ldrsh	r4, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iI.iX));		// r4 = old period multiplier shift
+	asm("ldmia	r0, {r0,r1,r2,r12} ");		// r1:r0=new frequency multiplier, r12:r2=new period multiplier
+	asm("str	r0, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iR.iM));		// update frequency multiplier
+	asm("str	r1, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iR.iX));		// update frequency multiplier
+	asm("str	r2, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iI.iM));		// update period multiplier
+	asm("str	r12, [r5, #%a0]" : : "i" _FOFF(TScheduler,iSX.iGTimerFreqRI.iI.iX));	// update period multiplier
+	asm("umull	r0, r1, r6, r3 ");
+	asm("mov	r2, #0 ");
+	asm("umlal	r1, r2, r7, r3 ");			// r2:r1:r0 = delta * old period multiplier
+	asm("ldr	r6, [r5, #%a0]!" : : "i" _FOFF(TScheduler,iSX.iTimestamp0));			// r6 = timestamp at last freq change (low)
+	asm("ldr	r7, [r5, #4] ");														// r7 = timestamp at last freq change (high)
+	asm("rsb	r4, r4, #0 ");
+	asm("rsb	r3, r4, #32 ");
+	asm("movs	r0, r0, lsr r4 ");			// rounding bit into C
+	asm("orr	r0, r0, r1, lsl r3 ");
+	asm("mov	r1, r1, lsr r4 ");
+	asm("orr	r1, r1, r2, lsl r3 ");		// r1:r0 = (delta * old period multiplier) >> old period multiplier shift
+	asm("adcs	r0, r0, r6 ");				// scaled delta + timestamp at last freq change
+	asm("adcs	r1, r1, r7 ");
+	asm("stmia	r5, {r0,r1} ");				// timestamp at last freq change = now
+	__DATA_MEMORY_BARRIER_Z__(r12);			/* Ensure all updates visible */
+	asm("ldmfd	sp!, {r4-r7} ");
+	__JUMP(,lr);
+	}
+
 #elif defined(__NKERN_TIMESTAMP_USE_INLINE_BSP_CODE__)
 #define __DEFINE_NKERN_TIMESTAMP_ASM__
 #include <variant_timestamp.h>
--- a/kernel/eka/nkernsmp/arm/ncutils.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/arm/ncutils.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -22,8 +22,6 @@
 #include <nk_irq.h>
 
 extern "C" {
-extern SVariantInterfaceBlock* VIB;
-
 extern TUint KernCoreStats_EnterIdle(TUint aCore);
 extern void KernCoreStats_LeaveIdle(TInt aCookie,TUint aCore);
 
@@ -31,6 +29,7 @@
 extern void send_irq_ipi(TSubScheduler*, TInt);
 }
 
+TInt ClockFrequenciesChanged();
 
 
 /******************************************************************************
@@ -89,66 +88,47 @@
 void NKern::Init0(TAny* a)
 	{
 	__KTRACE_OPT(KBOOT,DEBUGPRINT("VIB=%08x", a));
-	VIB = (SVariantInterfaceBlock*)a;
-	__NK_ASSERT_ALWAYS(VIB && VIB->iVer==0 && VIB->iSize==sizeof(SVariantInterfaceBlock));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iVer=%d iSize=%d", VIB->iVer, VIB->iSize));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxCpuClock=%08x %08x", I64HIGH(VIB->iMaxCpuClock), I64LOW(VIB->iMaxCpuClock)));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxTimerClock=%u", VIB->iMaxTimerClock));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iScuAddr=%08x", VIB->iScuAddr));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iGicDistAddr=%08x", VIB->iGicDistAddr));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iGicCpuIfcAddr=%08x", VIB->iGicCpuIfcAddr));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iLocalTimerAddr=%08x", VIB->iLocalTimerAddr));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iGlobalTimerAddr=%08x", VIB->iGlobalTimerAddr));
+	SVariantInterfaceBlock* v = (SVariantInterfaceBlock*)a;
+	TheScheduler.iVIB = v;
+	__NK_ASSERT_ALWAYS(v && v->iVer==0 && v->iSize==sizeof(SVariantInterfaceBlock));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iVer=%d iSize=%d", v->iVer, v->iSize));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxCpuClock=%08x %08x", I64HIGH(v->iMaxCpuClock), I64LOW(v->iMaxCpuClock)));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxTimerClock=%u", v->iMaxTimerClock));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iScuAddr=%08x", v->iScuAddr));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iGicDistAddr=%08x", v->iGicDistAddr));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iGicCpuIfcAddr=%08x", v->iGicCpuIfcAddr));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iLocalTimerAddr=%08x", v->iLocalTimerAddr));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iGlobalTimerAddr=%08x", v->iGlobalTimerAddr));
 
 	TScheduler& s = TheScheduler;
-	s.iSX.iScuAddr = (ArmScu*)VIB->iScuAddr;
-	s.iSX.iGicDistAddr = (GicDistributor*)VIB->iGicDistAddr;
-	s.iSX.iGicCpuIfcAddr = (GicCpuIfc*)VIB->iGicCpuIfcAddr;
-	s.iSX.iLocalTimerAddr = (ArmLocalTimer*)VIB->iLocalTimerAddr;
-	s.iSX.iTimerMax = (VIB->iMaxTimerClock / 1);		// use prescaler value of 1
+	s.iSX.iScuAddr = (ArmScu*)v->iScuAddr;
+	s.iSX.iGicDistAddr = (GicDistributor*)v->iGicDistAddr;
+	s.iSX.iGicCpuIfcAddr = (GicCpuIfc*)v->iGicCpuIfcAddr;
+	s.iSX.iLocalTimerAddr = (ArmLocalTimer*)v->iLocalTimerAddr;
+	s.iSX.iTimerMax = (v->iMaxTimerClock / 1);		// use prescaler value of 1
 #ifdef	__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK
-	s.iSX.iGlobalTimerAddr = (ArmGlobalTimer*)VIB->iGlobalTimerAddr;
+	s.iSX.iGlobalTimerAddr = (ArmGlobalTimer*)v->iGlobalTimerAddr;
+	s.iSX.iGTimerFreqRI.Set(v->iGTimerFreqR);
+	v->iGTimerFreqR = 0;
 #endif
 
 	TInt i;
 	for (i=0; i<KMaxCpus; ++i)
 		{
 		TSubScheduler& ss = TheSubSchedulers[i];
-		ss.iSSX.iCpuFreqM = KMaxTUint32;
-		ss.iSSX.iCpuFreqS = 0;
-		ss.iSSX.iCpuPeriodM = 0x80000000u;
-		ss.iSSX.iCpuPeriodS = 31;
-		ss.iSSX.iNTimerFreqM = KMaxTUint32;
-		ss.iSSX.iNTimerFreqS = 0;
-		ss.iSSX.iNTimerPeriodM = 0x80000000u;
-		ss.iSSX.iNTimerPeriodS = 31;
-		ss.iSSX.iTimerFreqM = KMaxTUint32;
-		ss.iSSX.iTimerFreqS = 0;
-		ss.iSSX.iTimerPeriodM = 0x80000000u;
-		ss.iSSX.iTimerPeriodS = 31;
-		ss.iSSX.iLastSyncTime = 0;
-		ss.iSSX.iTicksSinceLastSync = 0;
-		ss.iSSX.iLastTimerSet = 0;
-		ss.iSSX.iGapEstimate = 10<<16;
-		ss.iSSX.iGapCount = 0;
-		ss.iSSX.iTotalTicks = 0;
-		ss.iSSX.iDitherer = 1;
-		ss.iSSX.iFreqErrorEstimate = 0;
-		ss.iSSX.iFreqErrorLimit = 0x00100000;
-		ss.iSSX.iErrorIntegrator = 0;
-		ss.iSSX.iRefAtLastCorrection = 0;
-		ss.iSSX.iM = 4;
-		ss.iSSX.iN = 18;
-		ss.iSSX.iD = 3;
-		VIB->iTimerMult[i] = 0;
-		VIB->iCpuMult[i] = 0;
-		UPerCpuUncached* u = VIB->iUncached[i];
+		ss.iSSX.iCpuFreqRI.Set(v->iCpuFreqR[i]);
+		ss.iSSX.iTimerFreqRI.Set(v->iTimerFreqR[i]);
+
+		v->iCpuFreqR[i] = 0;
+		v->iTimerFreqR[i] = 0;
+		UPerCpuUncached* u = v->iUncached[i];
 		ss.iUncached = u;
 		u->iU.iDetachCount = 0;
 		u->iU.iAttachCount = 0;
 		u->iU.iPowerOffReq = FALSE;
 		u->iU.iDetachCompleteFn = &DetachComplete;
 		}
+	v->iFrqChgFn = &ClockFrequenciesChanged;
 	__e32_io_completion_barrier();
 	InterruptInit0();
 	}
@@ -374,16 +354,11 @@
 		s.AllCpusIdle();
 	s.iIdleSpinLock.UnlockOnly();
 
-	//TUint cookie = KernCoreStats::EnterIdle((TUint8)ss.iCpuNum);
 	TUint cookie = KernCoreStats_EnterIdle((TUint8)ss.iCpuNum);
 
 	arg |= retire;
 	NKIdle(arg);
 
-	//KernCoreStats::LeaveIdle(cookie, (TUint8)ss.iCpuNum);
-	KernCoreStats_LeaveIdle(cookie, (TUint8)ss.iCpuNum);
-
-
 	// interrupts have not been reenabled
 	s.iIdleSpinLock.LockOnly();
 
@@ -415,6 +390,8 @@
 	if (ci == 0)
 		s.FirstBackFromIdle();
 
+	KernCoreStats_LeaveIdle(cookie, (TUint8)ss.iCpuNum);
+
 	if (retire)
 		{
 		s.iCCReactivateDfc.RawAdd();	// kick load balancer to give us some work
@@ -432,12 +409,12 @@
 
 TBool TScheduler::CoreControlSupported()
 	{
-	return VIB->iCpuPowerUpFn != 0;
+	return TheScheduler.iVIB->iCpuPowerUpFn != 0;
 	}
 
 void TScheduler::CCInitiatePowerUp(TUint32 aCores)
 	{
-	TCpuPowerUpFn pUp = VIB->iCpuPowerUpFn;
+	TCpuPowerUpFn pUp = TheScheduler.iVIB->iCpuPowerUpFn;
 	if (pUp && aCores)
 		{
 		TInt i;
@@ -463,7 +440,7 @@
 
 void TScheduler::CCIndirectPowerDown(TAny*)
 	{
-	TCpuPowerDownFn pDown = VIB->iCpuPowerDownFn;
+	TCpuPowerDownFn pDown = TheScheduler.iVIB->iCpuPowerDownFn;
 	if (pDown)
 		{
 		TInt i;
@@ -555,3 +532,167 @@
 #endif
 	}
 
+/******************************************************************************
+ * Notify frequency changes
+ ******************************************************************************/
+
+struct SFrequencies
+	{
+	void Populate();
+	void Apply();
+	TBool AddToQueue();
+
+	SFrequencies*	iNext;
+	TUint32			iWhich;
+	SRatioInv		iNewCpuRI[KMaxCpus];
+	SRatioInv		iNewTimerRI[KMaxCpus];
+	SRatioInv		iNewGTimerRI;
+	NFastSemaphore*	iSem;
+
+	static SFrequencies* volatile Head;
+	};
+
+SFrequencies* volatile SFrequencies::Head;
+
+TBool SFrequencies::AddToQueue()
+	{
+	SFrequencies* h = Head;
+	do	{
+		iNext = h;
+		} while(!__e32_atomic_cas_rel_ptr(&Head, &h, this));
+	return !h;	// TRUE if list was empty
+	}
+
+
+void SFrequencies::Populate()
+	{
+	TScheduler& s = TheScheduler;
+	TInt cpu;
+	iWhich = 0;
+	SRatio* ri = (SRatio*)__e32_atomic_swp_ord_ptr(&s.iVIB->iGTimerFreqR, 0);
+	if (ri)
+		{
+		iNewGTimerRI.Set(ri);
+		iWhich |= 0x80000000u;
+		}
+	for (cpu=0; cpu<s.iNumCpus; ++cpu)
+		{
+		TSubScheduler& ss = *s.iSub[cpu];
+		ri = (SRatio*)__e32_atomic_swp_ord_ptr(&s.iVIB->iCpuFreqR[cpu], 0);
+		if (ri)
+			{
+			iNewCpuRI[cpu].Set(ri);
+			iWhich |= ss.iCpuMask;
+			}
+		ri = (SRatio*)__e32_atomic_swp_ord_ptr(&s.iVIB->iTimerFreqR[cpu], 0);
+		if (ri)
+			{
+			iNewTimerRI[cpu].Set(ri);
+			iWhich |= (ss.iCpuMask<<8);
+			}
+		}
+	}
+
+#if defined(__NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+extern void ArmGlobalTimerFreqChg(const SRatioInv* /*aNewGTimerFreqRI*/);
+#endif
+
+void SFrequencies::Apply()
+	{
+	if (!iWhich)
+		return;
+	TScheduler& s = TheScheduler;
+	TStopIPI ipi;
+	TUint32 stopped = ipi.StopCPUs();
+	TInt cpu;
+	TUint32 wait = 0;
+	for (cpu=0; cpu<s.iNumCpus; ++cpu)
+		{
+		TSubScheduler& ss = *s.iSub[cpu];
+		TUint32 m = 1u<<cpu;
+		TUint32 m2 = m | (m<<8);
+		if (stopped & m)
+			{
+			// CPU is running so let it update
+			if (iWhich & m2)
+				{
+				if (iWhich & m)
+					ss.iSSX.iNewCpuFreqRI = &iNewCpuRI[cpu];
+				if (iWhich & (m<<8))
+					ss.iSSX.iNewTimerFreqRI = &iNewTimerRI[cpu];
+				ss.iRescheduleNeededFlag = 1;
+				wait |= m;
+				}
+			}
+		else
+			{
+			// CPU is not running so update directly
+			if (iWhich & m)
+				{
+				ss.iSSX.iCpuFreqRI = iNewCpuRI[cpu];
+				}
+			if (iWhich & (m<<8))
+				{
+				ss.iSSX.iTimerFreqRI = iNewTimerRI[cpu];
+				}
+			}
+		}
+#if defined(__NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+	if (iWhich & 0x80000000u)
+		{
+		ArmGlobalTimerFreqChg(&iNewGTimerRI);
+		}
+#endif
+	ipi.ReleaseCPUs();	// this CPU handled here
+	while(wait)
+		{
+		cpu = __e32_find_ls1_32(wait);
+		TSubScheduler& ss = *s.iSub[cpu];
+		if (!ss.iSSX.iNewCpuFreqRI && !ss.iSSX.iNewTimerFreqRI)
+			wait &= ~ss.iCpuMask;
+		__chill();
+		}
+	}
+
+void TScheduler::DoFrequencyChanged(TAny*)
+	{
+	SFrequencies* list = (SFrequencies*)__e32_atomic_swp_ord_ptr(&SFrequencies::Head, 0);
+	if (!list)
+		return;
+	list->Populate();
+	list->Apply();
+	SFrequencies* rev = 0;
+	while (list)
+		{
+		SFrequencies* next = list->iNext;
+		list->iNext = rev;
+		rev = list;
+		list = next;
+		}
+	while (rev)
+		{
+		NFastSemaphore* s = rev->iSem;
+		rev = rev->iNext;
+		NKern::FSSignal(s);
+		}
+	}
+
+TInt ClockFrequenciesChanged()
+	{
+	TScheduler& s = TheScheduler;
+	NFastSemaphore sem(0);
+	SFrequencies f;
+	f.iSem = &sem;
+	NThread* ct = NKern::CurrentThread();
+	NThread* lbt = TScheduler::LBThread();
+	NKern::ThreadEnterCS();
+	TBool first = f.AddToQueue();
+	if (!lbt || lbt == ct)
+		TScheduler::DoFrequencyChanged(&s);
+	else if (first)
+		s.iFreqChgDfc.Enque();
+	NKern::FSWait(&sem);
+	NKern::ThreadLeaveCS();
+	return KErrNone;
+	}
+
--- a/kernel/eka/nkernsmp/nk_bal.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/nk_bal.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -135,6 +135,7 @@
 	s.iCCReactivateDfc.SetDfcQ(rbQ);
 	s.iCCRequestDfc.SetDfcQ(rbQ);
 	s.iCCPowerDownDfc.SetDfcQ(rbQ);
+	s.iFreqChgDfc.SetDfcQ(rbQ);
 	NThreadBase* lbt = rbQ->iThread;
 	lbt->iRebalanceAttr = 1;
 	TUint32 f = NKern::CpuTimeMeasFreq();
--- a/kernel/eka/nkernsmp/nkern.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/nkern.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -2846,28 +2846,62 @@
 
 /**	Stop all other CPUs
 
-	Call with kernel locked
+Call with kernel unlocked, returns with kernel locked.
+Returns mask of CPUs halted plus current CPU.
 */
-void TStopIPI::StopCPUs()
+TUint32 TStopIPI::StopCPUs()
 	{
+	CHECK_PRECONDITIONS(MASK_THREAD_STANDARD,"TStopIPI::StopCPUs()");
+	TScheduler& s = TheScheduler;
 	iFlag = 0;
+	NKern::ThreadEnterCS();
+
+	// Stop any cores powering up or down for now
+	// A core already on the way down will stop just before the transition to SHUTDOWN_FINAL
+	// A core already on the way up will carry on powering up
+	TInt irq = s.iGenIPILock.LockIrqSave();
+	++s.iCCDeferCount;	// stops bits in iIpiAcceptCpus being cleared, but doesn't stop them being set
+						// but iIpiAcceptCpus | s.iCpusComingUp is constant
+	TUint32 act2 = s.iIpiAcceptCpus;		// CPUs still accepting IPIs
+	TUint32 cu = s.iCpusComingUp;			// CPUs powering up
+	s.iGenIPILock.UnlockIrqRestore(irq);
+	TUint32 cores = act2 | cu;
+	if (cu)
+		{
+		// wait for CPUs coming up to start accepting IPIs
+		while (cores & ~s.iIpiAcceptCpus)
+			{
+			__snooze();	// snooze until cores have come up
+			}
+		}
+	NKern::Lock();
 	QueueAllOther(&Isr);	// send IPIs to all other CPUs
 	WaitEntry();			// wait for other CPUs to reach the ISR
+	return cores;
 	}
 
+
+/**	Release the stopped CPUs
+
+Call with kernel locked, returns with kernel unlocked.
+*/
 void TStopIPI::ReleaseCPUs()
 	{
-	iFlag = 1;				// allow other CPUs to proceed
+	__e32_atomic_store_rel32(&iFlag, 1);	// allow other CPUs to proceed
 	WaitCompletion();		// wait for them to finish with this IPI
+	NKern::Unlock();
+	TheScheduler.CCUnDefer();
+	NKern::ThreadLeaveCS();
 	}
 
 void TStopIPI::Isr(TGenericIPI* a)
 	{
 	TStopIPI* s = (TStopIPI*)a;
-	while (!s->iFlag)
+	while (!__e32_atomic_load_acq32(&s->iFlag))
 		{
 		__chill();
 		}
+	__e32_io_completion_barrier();
 	}
 
 
--- a/kernel/eka/nkernsmp/nkern.mmp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/nkern.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -17,6 +17,8 @@
 
 sourcepath				../nkernsmp
 source					nkern.cpp nkerns.cpp sched.cpp dfcs.cpp nk_timer.cpp nk_irq.cpp nk_bal.cpp
+sourcepath				../nkern
+source					nklib.cpp
 
 #ifdef MARM
 sourcepath				../common/arm
@@ -24,6 +26,8 @@
 sourcepath				../nkernsmp/arm
 source					vectors.cia ncsched.cpp ncsched.cia nctimer.cia ncutilf.cia ncirq.cpp ncirq.cia ncthrd.cia
 source					ncutils.cia ncutils.cpp ncthrd.cpp ncglob.cpp nccpu.cpp nccpu.cia
+sourcepath				../nkern/arm
+source					nklib.cia
 
 
 #elif defined(X86)
--- a/kernel/eka/nkernsmp/nkerns.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/nkerns.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -242,8 +242,8 @@
 		iCurrent = iReady;
 		iCpuAffinity = iLastCpu;
 		iEventState = (iLastCpu<<EEventCpuShift) | (iLastCpu<<EThreadCpuShift);
-		i_NThread_Initial = TRUE; // must set as initial before 
-		ss.SSAddEntry(this);      // adding to subsched list
+		i_NThread_Initial = TRUE;	// must set initial thread flag before adding to subscheduler
+		ss.SSAddEntry(this);		// in order to get correct ready thread count (i.e. not including the idle thread)
 		iACount = 1;
 		ss.iInitialThread = (NThread*)this;
 		NKern::Unlock();		// now that current thread is defined
@@ -538,6 +538,7 @@
 
 NThread* TScheduler::LBThread()
 	{
-	return (NThread*)(TheScheduler.iRebalanceDfcQ->iThread);
+	TDfcQue* rbQ = TheScheduler.iRebalanceDfcQ;
+	return rbQ ? (NThread*)(rbQ->iThread) : 0;
 	}
 
--- a/kernel/eka/nkernsmp/sched.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/sched.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -60,7 +60,8 @@
 		iCCRequestLevel(1),		// only boot CPU for now
 		iCCRequestDfc(&CCRequestDfcFn, this, 2),
 		iCCPowerDownDfc(&CCIndirectPowerDown, this, 0),
-		iCCIpiReactIDFC(&CCIpiReactivateFn, this)
+		iCCIpiReactIDFC(&CCIpiReactivateFn, this),
+		iFreqChgDfc(&DoFrequencyChanged, this, 6)
 	{
 	TInt i;
 	for (i=0; i<KMaxCpus; ++i)
@@ -1360,4 +1361,3 @@
 	DoIdle();
 	}
 
-
--- a/kernel/eka/nkernsmp/x86/ncglob.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/x86/ncglob.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -32,8 +32,6 @@
 TSubScheduler TheSubSchedulers[KMaxCpus];
 extern "C" {
 TSubScheduler* SubSchedulerLookupTable[256];
-
-SVariantInterfaceBlock* VIB;
 }
 
 #ifdef __USE_BTRACE_LOCK__
--- a/kernel/eka/nkernsmp/x86/ncmonitor.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/x86/ncmonitor.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -35,9 +35,8 @@
 	m.Printf("Extras[ 4] %08x Extras[ 5] %08x Extras[ 6] %08x Extras[ 7] %08x\r\n", x.iSSXP[4], x.iSSXP[5], x.iSSXP[6], x.iSSXP[7]);
 	m.Printf("Extras[ 8] %08x i_IrqCount %08x i_ExcInfo  %08x i_CrashSt  %08x\r\n", x.iSSXP[8], x.iIrqCount, x.iExcInfo, x.iCrashState);
 	m.Printf("i_APICID   %08x i_IrqNestC %08x i_IrqStkTp %08x i_Tss      %08x\r\n", x.iAPICID, x.iIrqNestCount, x.iIrqStackTop, x.iTss);
-	m.Printf("CpuFreqM   %08x CpuFreqS   %08x CpuPeriodM %08x CpuPeriodS %08x\r\n", x.iCpuFreqM, x.iCpuFreqS, x.iCpuPeriodM, x.iCpuPeriodS);
-	m.Printf("NTmrFreqM  %08x NTmrFreqS  %08x NTmPeriodM %08x NTmPeriodS %08x\r\n", x.iNTimerFreqM, x.iNTimerFreqS, x.iNTimerPeriodM, x.iNTimerPeriodS);
-	m.Printf("TmrFreqM   %08x TmrFreqS   %08x TmrPeriodM %08x TmrPeriodS %08x\r\n", x.iTimerFreqM, x.iTimerFreqS, x.iTimerPeriodM, x.iTimerPeriodS);
+	m.Printf("CpuFreqM   %08x CpuFreqS   %08x CpuPeriodM %08x CpuPeriodS %08x\r\n", x.iCpuFreqRI.iR.iM, x.iCpuFreqRI.iR.iX, x.iCpuFreqRI.iI.iM, x.iCpuFreqRI.iI.iX);
+	m.Printf("TmrFreqM   %08x TmrFreqS   %08x TmrPeriodM %08x TmrPeriodS %08x\r\n", x.iTimerFreqRI.iR.iM, x.iTimerFreqRI.iR.iX, x.iTimerFreqRI.iI.iM, x.iTimerFreqRI.iI.iX);
 	m.Printf("TmstampOff %08x %08x            iSSXP2[0]  %08x iSSXP2[1]  %08x\r\n", I64HIGH(x.iTimestampOffset.i64), I64LOW(x.iTimestampOffset.i64), x.iSSXP2[0], x.iSSXP2[1]);
 	}
 
--- a/kernel/eka/nkernsmp/x86/ncsched.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/x86/ncsched.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -99,11 +99,8 @@
 	{
 	if (aT->iTime>0 && !aT->i_NThread_Initial)
 		{
-		TUint32 remain32 = read_apic_reg(CURRCNT);
-		TUint64 x(remain32);
-		x *= TUint32(iSSX.iTimerPeriodM);
-		x += 1u<<(iSSX.iTimerPeriodS-1);
-		x >>= iSSX.iTimerPeriodS;
+		TUint32 x = read_apic_reg(CURRCNT);
+		iSSX.iTimerFreqRI.iI.Mult(x);
 		aT->iTime = (TInt)x;
 		}
 	write_apic_reg(INITCNT, 0);
@@ -128,13 +125,9 @@
 		aNew = iInitialThread;
 	if (aNew->iTime>0)
 		{
-		TUint32 remain32 = (TUint32)aNew->iTime;
-		TUint64 x(remain32);
-		x *= TUint32(iSSX.iTimerFreqM);
-		x += TUint64(0x80000000u)<<iSSX.iTimerFreqS;
-		x >>= (32+iSSX.iTimerFreqS);
-		write_apic_reg(LVTTMR, TIMESLICE_VECTOR);
-		write_apic_reg(INITCNT, (TUint32)x);
+		TUint32 x = (TUint32)aNew->iTime;
+		iSSX.iTimerFreqRI.iR.Mult(x);
+		write_apic_reg(INITCNT, x);
 		}
 	if (aNew!=aOld)
 		{
--- a/kernel/eka/nkernsmp/x86/ncutilf.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/x86/ncutilf.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -15,11 +15,8 @@
 // 
 //
 
-#include <nkern.h>
+#include <nk_priv.h>
 
-extern "C" {
-extern SVariantInterfaceBlock* VIB;
-}
 
 /******************************************************************************
  * Spin lock
@@ -65,6 +62,6 @@
 */
 EXPORT_C TUint32 NKern::TimestampFrequency()
 	{
-	return VIB->iTimestampFreq;
+	return TheScheduler.iVIB->iTimestampFreq;
 	}
 
--- a/kernel/eka/nkernsmp/x86/ncutils.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/nkernsmp/x86/ncutils.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -17,10 +17,6 @@
 
 #include <x86.h>
 
-extern "C" {
-extern SVariantInterfaceBlock* VIB;
-}
-
 //#define __DBG_MON_FAULT__
 //#define __RAM_LOADED_CODE__
 //#define __EARLY_DEBUG__
@@ -325,33 +321,25 @@
 void NKern::Init0(TAny* a)
 	{
 	__KTRACE_OPT(KBOOT,DEBUGPRINT("VIB=%08x", a));
-	VIB = (SVariantInterfaceBlock*)a;
-	__NK_ASSERT_ALWAYS(VIB && VIB->iVer==0 && VIB->iSize==sizeof(SVariantInterfaceBlock));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iVer=%d iSize=%d", VIB->iVer, VIB->iSize));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxCpuClock=%08x %08x", I64HIGH(VIB->iMaxCpuClock), I64LOW(VIB->iMaxCpuClock)));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iTimestampFreq=%u", VIB->iTimestampFreq));
-	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxTimerClock=%u", VIB->iMaxTimerClock));
+	SVariantInterfaceBlock* v = (SVariantInterfaceBlock*)a;
+	TheScheduler.iVIB = v;
+	__NK_ASSERT_ALWAYS(v && v->iVer==0 && v->iSize==sizeof(SVariantInterfaceBlock));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iVer=%d iSize=%d", v->iVer, v->iSize));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxCpuClock=%08x %08x", I64HIGH(v->iMaxCpuClock), I64LOW(v->iMaxCpuClock)));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iTimestampFreq=%u", v->iTimestampFreq));
+	__KTRACE_OPT(KBOOT,DEBUGPRINT("iMaxTimerClock=%u", v->iMaxTimerClock));
 	TInt i;
 	for (i=0; i<KMaxCpus; ++i)
 		{
 		TSubScheduler& ss = TheSubSchedulers[i];
-		ss.iSSX.iCpuFreqM = KMaxTUint32;
-		ss.iSSX.iCpuFreqS = 0;
-		ss.iSSX.iCpuPeriodM = 0x80000000u;
-		ss.iSSX.iCpuPeriodS = 31;
-		ss.iSSX.iNTimerFreqM = KMaxTUint32;
-		ss.iSSX.iNTimerFreqS = 0;
-		ss.iSSX.iNTimerPeriodM = 0x80000000u;
-		ss.iSSX.iNTimerPeriodS = 31;
-		ss.iSSX.iTimerFreqM = KMaxTUint32;
-		ss.iSSX.iTimerFreqS = 0;
-		ss.iSSX.iTimerPeriodM = 0x80000000u;
-		ss.iSSX.iTimerPeriodS = 31;
+		ss.iSSX.iCpuFreqRI.Set(v->iCpuFreqR[i]);
+		ss.iSSX.iTimerFreqRI.Set(v->iTimerFreqR[i]);
+
 		ss.iSSX.iTimestampOffset.i64 = 0;
-		VIB->iTimerMult[i] = 0;
-		VIB->iCpuMult[i] = 0;
+		v->iCpuFreqR[i] = 0;
+		v->iTimerFreqR[i] = 0;
 		}
-	TheScheduler.iSX.iTimerMax = (VIB->iMaxTimerClock / 128);
+	TheScheduler.iSX.iTimerMax = (v->iMaxTimerClock / 128);
 	InitFpu();
 	InterruptInit0();
 	}
@@ -400,3 +388,6 @@
 	{
 	}
 
+void TScheduler::DoFrequencyChanged(TAny*)
+	{
+	}
--- a/kernel/eka/release.txt	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/release.txt	Tue Jul 06 15:50:07 2010 +0300
@@ -1,3 +1,55 @@
+Version 2.00.3098
+=================
+(Made by vfebvre 18/06/2010)
+
+1.	garciato
+	1.	RP520151
+		REQ:417-52765 - SMP: Product Quality SMP Kernel for Bridge
+
+
+Version 2.00.3097
+=================
+(Made by vfebvre 16/06/2010)
+
+1.	jcoppear
+	1.	ou1cimx1#444092 MCL ENV E32TEST T_THRASH test timeout on 92
+
+2.	shubmurt
+	1.	ou1cimx1#423695 MCL:Mobile Crash #25334: CodeAbort exception in CompleteQue method, kernel/sproperty.cpp
+
+
+Version 2.00.3095
+=================
+(Made by vfebvre 14/06/2010)
+
+1.	kingzhan
+	1.	ou1cimx1#425296 MCL Mutex ordering violation in USB driver
+
+2.	jcoppear
+	1.	ou1cimx1#432392 System reset during execution of T_SHBUF_CLIENT
+	2.	ou1cimx1#380623 WDP: Non aligned swap writes increase media wear
+
+3.	martai
+	1.	ou1cimx1#435628 Copy of WDP: Paged data can be corrupted randomly
+	2.	ou1cimx1#424896 E32TEST T_RAMALL occasionally times out
+	3.	ou1cimx1#412959 ENV X86GCC compilation warnings t_ramall.cpp
+	4.	ou1cimx1#384467 Contiguous memory allocations do not use multi-page write support
+
+4.	coliward
+	1.	ou1cimx1#428886 SDK specific: Unable to Install Midlet in the Emulator.
+
+
+Version 2.00.3094
+=================
+(Made by vfebvre 10/06/2010)
+
+1.	jimhofe
+	1.	ou1cimx1#419221 Missing exported kernelhwsrv documentation causes build breaks
+
+2.	lanerobe
+	1.	ou1cimx1#427741 Reset timestamp before running test
+
+
 Version 2.00.3093
 =================
 (Made by vfebvre 09/06/2010)
--- a/kernel/eka/rombuild/kernel.hby	Wed Jun 23 19:44:53 2010 +0300
+++ b/kernel/eka/rombuild/kernel.hby	Tue Jul 06 15:50:07 2010 +0300
@@ -17,10 +17,12 @@
 #define EKernelConfigSMPUnsafeCompat	12
 #define EKernelConfigSMPUnsafeCPU0		13
 #define EKernelConfigSMPCrazyInterrupts	14
+#define EKernelConfigSMPLockKernelThreadsCore0 15
 #define EKernelConfigDisableAPs			30
 
 #define CRAZYSCHEDULING(state)	kernelconfig EKernelConfigCrazyScheduling state
 #define SMPUNSAFECOMPAT(state)	kernelconfig EKernelConfigSMPUnsafeCompat state
 #define SMPUNSAFECPU0(state)	kernelconfig EKernelConfigSMPUnsafeCPU0 state
 #define CRAZYINTERRUPTS(state)	kernelconfig EKernelConfigSMPCrazyInterrupts state
+#define SMPLOCKKERNELTHREADSCPU0(state)	kernelconfig EKernelConfigSMPLockKernelThreadsCore0 state
 #define	SMP_USE_BP_ONLY(state)	kernelconfig EKernelConfigDisableAPs state
--- a/kerneltest/e32test/benchmark/thread.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/benchmark/thread.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -165,8 +165,10 @@
 		BM_ERROR(r, r == KErrNone);
 		child.Logon(st);
 		BMProgram::SetAbsPriority(RThread(), KBMPriorityLow);
+		TRequestStatus threadRunning;
+		child.Rendezvous(threadRunning);
 		child.Resume();
-		User::After(1000); // Give the child thread a chance to run - killing it too earlier can leave the heap locked
+		User::WaitForRequest(threadRunning);	// Wait for the thread to run before killing it.
 		BMProgram::SetAbsPriority(RThread(), KBMPriorityHigh);
 		TBMTicks t1;
 		::bmTimer.Stamp(&t1);
@@ -183,6 +185,7 @@
 
 TInt Thread::KillingChild(TAny*)
 	{
+	RThread::Rendezvous(KErrNone);
 	User::WaitForAnyRequest();
 	return KErrNone;
 	}
--- a/kerneltest/e32test/defrag/t_ramdefrag.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/defrag/t_ramdefrag.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -1518,7 +1518,7 @@
 				}
 			else
 				{
-				if ((allocMov || allocDis) && prevZoneNotFull)
+				if (verifySpread && (allocMov || allocDis) && prevZoneNotFull)
 					{// The previous least preferable RAM zones were not full so shouldn't
 					// be any movable or discardable pages in the RAM zones of this preference.
 					test.Printf(_L("Movable or discardable pages in more preferable RAM zones unnecessarily\n"));
@@ -3053,8 +3053,9 @@
 				break;
 				}
 			totMov -= gZoneUtilArray[zoneIndexCand].iAllocMovable;
-			if (gZoneUtilArray[zoneIndexCand].iFreePages != gZoneUtilArray[zoneIndexCand].iPhysPages &&
-				gZoneUtilArray[zoneIndexCand].iFreePages != 0)
+			if (gZoneUtilArray[zoneIndexCand].iFreePages &&
+				(gZoneUtilArray[zoneIndexCand].iAllocMovable || 
+				gZoneUtilArray[zoneIndexCand].iAllocDiscardable))
 				{
 				zoneNotEmptyOrFull = ETrue;
 				}
--- a/kerneltest/e32test/demandpaging/t_thrash.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/demandpaging/t_thrash.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -270,10 +270,10 @@
 		RThread thread;
 		test_KErrNone(thread.Create(_L("EnsureSystemIdleThread"), EnsureSystemIdleThread, 1024, NULL, NULL));		
 		thread.SetPriority(EPriorityLess);
+		TRequestStatus status;
+		thread.Rendezvous(status);
 		thread.Resume();
 
-		TRequestStatus status;
-		thread.Rendezvous(status);
 		User::WaitForRequest(status);
 		test_KErrNone(status.Int());
 
@@ -667,7 +667,7 @@
 	delete [] data;
 	}
 
-void BenchmarkReplacement()
+void TestDistributions()
 	{
  	test.Next(_L("Test uniform distribution"));
 	TUniformRandom rand1;
@@ -678,6 +678,49 @@
 	TNormalRandom rand2;
 	rand2.SetParams(100, 25);
 	TestDistribution(rand2, 10000);
+	}
+
+void BenchmarkReplacement()
+	{
+	// Report block write and physical access settings
+	test.Next(_L("Report media physical access and preferred write size settings"));
+	TInt physAccessSupported = UserSvr::HalFunction(EHalGroupVM, EVMHalGetPhysicalAccessSupported, 0, 0);
+	test(physAccessSupported == 0 || physAccessSupported == 1);
+	if (physAccessSupported)
+ 		test.Printf(_L("Physical access supported\n"));
+	else
+ 		test.Printf(_L("Physical access not supported\n"));
+
+	TInt preferredWriteSize = UserSvr::HalFunction(EHalGroupVM, EVMHalGetPreferredDataWriteSize, 0, 0);
+	test(preferredWriteSize >= 0);
+	test.Printf(_L("Preferred write size %d pages\n"), 1 << preferredWriteSize);
+
+	for (TInt physAccess = 0 ; physAccess <= physAccessSupported ; ++physAccess)
+		{
+		test_KErrNone(UserSvr::HalFunction(EHalGroupVM, EVMHalSetUsePhysicalAccess, (TAny*)physAccess, 0));
+		test_Equal(physAccess, UserSvr::HalFunction(EHalGroupVM, EVMHalGetUsePhysicalAccess, 0, 0));
+		TInt writeSize = 0;
+		for (;;)
+			{
+			test_KErrNone(UserSvr::HalFunction(EHalGroupVM, EVMHalSetDataWriteSize, (TAny*)writeSize, 0));
+			TInt writeSizeSet = UserSvr::HalFunction(EHalGroupVM, EVMHalGetDataWriteSize, 0, 0);
+			test (writeSizeSet >= 0);
+			if (writeSizeSet != writeSize)
+				break;  // stop loop when we reach limit of supported write size
+
+			TBuf<128> title;
+			title.AppendFormat(_L("Thrash test: single thread, normal random workload 2, phys access %d, write size %dKB"),
+							   physAccess, 1 << (writeSize - 2));
+			ThrashTest(title, 1, ETrue, EWorkloadNormalRandom2, (2 * gMaxCacheSize) / 3, 2 * gMaxCacheSize, 0);
+
+			++writeSize;
+			}
+		}
+
+	test_KErrNone(UserSvr::HalFunction(EHalGroupVM, EVMHalSetUsePhysicalAccess, (TAny*)physAccessSupported, 0));
+	test_Equal(physAccessSupported, UserSvr::HalFunction(EHalGroupVM, EVMHalGetUsePhysicalAccess, 0, 0));
+	test_KErrNone(UserSvr::HalFunction(EHalGroupVM, EVMHalSetDataWriteSize, (TAny*)preferredWriteSize, 0));
+	test_Equal(preferredWriteSize, UserSvr::HalFunction(EHalGroupVM, EVMHalGetDataWriteSize, 0, 0));
 
 	ThrashTest(_L("Thrash test: single thread, normal random workload 1"),
 			   1, ETrue, EWorkloadNormalRandom1, (2 * gMaxCacheSize) / 3, 2 * gMaxCacheSize, 0);
@@ -853,6 +896,7 @@
 	if (actions & EActionBenchmarks)
 		{	
 		test.Next(_L("Benchmarking page replacement"));
+		TestDistributions();
 		BenchmarkReplacement();
 		}
 
--- a/kerneltest/e32test/group/bld.inf	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/group/bld.inf	Tue Jul 06 15:50:07 2010 +0300
@@ -83,6 +83,7 @@
  positive check ( #ifdef SMP ), however these binaries will not be included in BTB 
  autotest images for SMP platforms. Refer to DTW-KHS BTB00055 for more details.
  ******************************************************************************/
+d_timestamp					support
 d_kerncorestats				support
 d_implicit					support
 d_emitest					support
@@ -711,6 +712,9 @@
 t_domain_slave  support
 domainPolicyTest support
 t_switchoff
+t_frqchg
+// /E32TEST/TIMESTAMP test
+t_timestamp
 
 // /E32TEST/PRIME tests
 t_kern      support
@@ -1064,7 +1068,4 @@
 
 //pci tests
 t_pci
-// timestamp or fastcounter test
-t_timestamp
-d_timestamp		support
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/group/d_frqchg.mmh	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,48 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test/group/d_frqchg.mmh
+// 
+//
+
+// NOTE : include your variant.mmh before this file
+
+#ifdef EPOC32
+target			VariantTarget(d_frqchg,ldd)
+#else
+target			d_frqchg.ldd
+#endif
+#include		"kernel/kern_ext.mmh"
+
+targettype		ldd
+romtarget		d_frqchg.ldd
+
+sourcepath		../power
+source			d_frqchg.cpp
+
+sourcepath		../../../kernel/eka/nkern
+source			nklib.cpp
+
+#ifdef MARM
+sourcepath		../../../kernel/eka/nkern/arm
+source			nklib.cia
+#endif
+
+
+epocallowdlldata
+
+vendorid		0x70000001
+capability		all
+
+macro CPU_AFFINITY_ANY
+smpsafe
--- a/kerneltest/e32test/group/t_cachechunk.mmp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/group/t_cachechunk.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -18,7 +18,7 @@
 TARGET			t_cachechunk.exe        
 TARGETTYPE		EXE
 SOURCEPATH		../mmu
-SOURCE			t_cachechunk.cpp
+SOURCE			t_cachechunk.cpp ..\demandpaging\t_dpcmn.cpp
 LIBRARY			euser.lib hal.lib dptest.lib
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/group/t_frqchg.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,27 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\group\t_frqchg.mmp
+// 
+//
+
+target			t_frqchg.exe
+targettype		exe
+sourcepath		../power
+source			t_frqchg.cpp
+library			euser.lib hal.lib
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+capability		all
+vendorid		0x70000001
+epocheapsize	0x00001000 0x00100000
+smpsafe
--- a/kerneltest/e32test/group/t_ramall.mmp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/group/t_ramall.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -19,7 +19,7 @@
 targettype		exe
 sourcepath		../mmu
 source			t_ramall.cpp
-library			euser.lib  dptest.lib
+library			euser.lib  dptest.lib hal.lib
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
 
--- a/kerneltest/e32test/group/t_semutx.mmp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/group/t_semutx.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -19,7 +19,7 @@
 TARGETTYPE     EXE
 SOURCEPATH	../prime
 SOURCE         t_semutx.cpp
-LIBRARY        euser.lib
+LIBRARY        euser.lib hal.lib
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
 
--- a/kerneltest/e32test/misc/t_cputime.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/misc/t_cputime.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -262,6 +262,7 @@
 	test(100*us >= 98*KShortWait); // left limit
 	test(us - KShortWait <= user_after_tolerance); // right limit
 
+	FailIfError(thread.GetCpuTime(time));
 	User::After(KLongWait);
 	FailIfError(thread.GetCpuTime(time2));
 	us = time2.Int64() - time.Int64();
--- a/kerneltest/e32test/mmu/t_cachechunk.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/mmu/t_cachechunk.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -87,8 +87,9 @@
 #include "d_gobble.h"
 #include <dptest.h>
 #include "freeram.h"
+#include "..\demandpaging\t_dpcmn.h"
 
-LOCAL_D RTest test(_L("T_CACHECHUNK"));
+RTest test(_L("T_CACHECHUNK"));
 
 RMemoryTestLdd MemoryTest;
 
@@ -504,6 +505,175 @@
 	}
 
 
+TBool StopCacheThreads;
+
+TInt CacheThreadFunc(TAny* aMax)
+	{
+	RThread::Rendezvous(KErrNone);
+	while (!StopCacheThreads)
+		{
+		TInt maxSize = (TInt)aMax;
+		TInt minSize;
+		TInt r = KErrNone;
+		for (minSize = PageSize << 4; r == KErrNone && !StopCacheThreads; minSize += PageSize)
+			{
+			r = UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
+			User::After(minSize/PageSize);
+			}
+		for (minSize -= PageSize; 
+			minSize > PageSize << 4 && r == KErrNone  && !StopCacheThreads;
+			minSize -= PageSize)
+			{
+			r = UserSvr::HalFunction(EHalGroupVM,EVMHalSetCacheSize,(TAny*)minSize,(TAny*)maxSize);
+			User::After(minSize/PageSize);
+			}
+		}
+	return KErrNone;
+	}
+
+
+TInt DonateThreadFunc(TAny*)
+	{
+	TChunkCreateInfo createInfo;
+	createInfo.SetCache(100 * PageSize);
+	RChunk chunk;
+	TInt r = chunk.Create(createInfo);
+	if (r != KErrNone)
+		{
+		RDebug::Printf("DonateThreadFunc: Failed to create cache chunk %d", r);
+		return r;
+		}
+	TUint chunkEnd = 0;
+	while (chunk.Commit(chunkEnd, PageSize) == KErrNone)
+		chunkEnd += PageSize;
+
+	RThread::Rendezvous(KErrNone);
+	while (!StopCacheThreads)
+		{
+		for (TUint i = PageSize; i <= chunkEnd && !StopCacheThreads; i += PageSize)
+			{
+			chunk.Unlock(0, i);
+			if (chunk.Lock(0, i) != KErrNone)
+				{// Recommit as many pages as possible.
+				while (chunk.Commit(0, chunkEnd) != KErrNone && !StopCacheThreads)
+					chunkEnd -= PageSize;
+				i = 0;
+				}
+			User::After(i/PageSize);
+			}
+		}
+	CLOSE_AND_WAIT(chunk);
+	return KErrNone;
+	}
+
+
+TInt DirtyThreadFunc(TAny*)
+	{
+	RThread::Rendezvous(KErrNone);
+
+	RChunk chunk;
+	TChunkCreateInfo createInfo;
+	createInfo.SetNormal(PageSize * 100, PageSize *100);
+	createInfo.SetPaging(TChunkCreateInfo::EPaged);
+	TInt r = chunk.Create(createInfo);
+	if (r != KErrNone)
+		{
+		RDebug::Printf("Failed to create a cache chunk %d", r);
+		return r;
+		}
+	TUint8* base = chunk.Base();
+	// Dirty each page in the chunk so that there are dirty pages in the live 
+	// list while it is being resized and pages are being unlocked.
+	while (!StopCacheThreads)
+		{
+		TUint8* p = base;
+		TUint8* pEnd = base + chunk.Size();
+		for (; p < pEnd && !StopCacheThreads; p += PageSize)
+			{
+			*p = (TUint8)(pEnd - p);
+			User::After((TUint8)(pEnd - p));
+			}
+		}
+	CLOSE_AND_WAIT(chunk);
+	return KErrNone;
+	}
+
+
+void TestResizeExcess()
+	{
+	test.Printf(_L("Commit all of memory again leaving 100 free pages\n"));
+	CommitEnd = 0;
+	TInt r;
+	while(KErrNone==(r=TestChunk.Commit(CommitEnd,PageSize)))
+		{
+		CommitEnd += PageSize;
+		}
+	test(r==KErrNoMemory);
+	test_KErrNone(TestChunk.Unlock(0, 100 * PageSize));
+
+	SVMCacheInfo info;
+	test_KErrNone(UserSvr::HalFunction(EHalGroupVM, EVMHalGetCacheSize, &info, 0));
+
+	StopCacheThreads = EFalse;
+	RThread cacheThread;
+	r = cacheThread.Create(	KNullDesC, CacheThreadFunc, KDefaultStackSize, PageSize,
+							PageSize, (TAny*)info.iMaxSize);
+	test_KErrNone(r);
+	TRequestStatus threadStarted;
+	cacheThread.Rendezvous(threadStarted);
+	TRequestStatus cacheStatus;
+	cacheThread.Logon(cacheStatus);
+	cacheThread.Resume();
+	User::WaitForRequest(threadStarted);
+	test_KErrNone(threadStarted.Int());
+
+	// Create the dirty thread before the donate thread as the donate thread may
+	// consume all the free ram periodically.
+	RThread dirtyThread;
+	r = dirtyThread.Create(KNullDesC, DirtyThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL);
+	test_KErrNone(r);
+	dirtyThread.Rendezvous(threadStarted);
+	TRequestStatus dirtyStatus;
+	dirtyThread.Logon(dirtyStatus);
+	dirtyThread.Resume();
+	User::WaitForRequest(threadStarted);
+	test_KErrNone(threadStarted.Int());
+
+	RThread donateThread;
+	r = donateThread.Create(KNullDesC, DonateThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL);
+	test_KErrNone(r);
+	donateThread.Rendezvous(threadStarted);
+	TRequestStatus donateStatus;
+	donateThread.Logon(donateStatus);
+	donateThread.Resume();
+	User::WaitForRequest(threadStarted);
+	test_KErrNone(threadStarted.Int());
+
+	// Run test for 10 secs.
+	User::After(10000000);
+
+	// End the test.
+	StopCacheThreads = ETrue;
+	User::WaitForRequest(donateStatus);
+	test_Equal(EExitKill, donateThread.ExitType());
+	test_KErrNone(donateThread.ExitReason());
+	User::WaitForRequest(dirtyStatus);
+	test_Equal(EExitKill, dirtyThread.ExitType());
+	test_KErrNone(dirtyThread.ExitReason());
+	User::WaitForRequest(cacheStatus);
+	test_Equal(EExitKill, cacheThread.ExitType());
+	test_KErrNone(cacheThread.ExitReason());
+
+	CLOSE_AND_WAIT(donateThread);
+	CLOSE_AND_WAIT(cacheThread);
+	CLOSE_AND_WAIT(dirtyThread);
+
+	test_KErrNone(UserSvr::HalFunction(	EHalGroupVM,
+										EVMHalSetCacheSize,
+										(TAny*)info.iMinSize,
+										(TAny*)info.iMaxSize));
+	}
+
 
 TInt E32Main()
 	{
@@ -636,6 +806,16 @@
 	if (resizeCache)
 		test_KErrNone(DPTest::SetCacheSize(originalMin, originalMax));
 
+	test_KErrNone(GetGlobalPolicies());
+	if (gDataPagingSupported)
+		{
+		test.Next(_L("Test interactions of chunk unlocking and page cache resizing"));
+		// Do this after the live list limit is restored.
+		test_KErrNone(TestChunk.Create(createInfo));
+		TestResizeExcess();
+		TestChunk.Close();
+		}
+
 	// end...
 	test.End();
 	MemoryTest.Close();
--- a/kerneltest/e32test/mmu/t_demandpaging.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/mmu/t_demandpaging.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -121,15 +121,18 @@
 
 #define READ(a) ReadByte((volatile TUint8*)(a))
 
-void ThrashPaging(TUint aMaxBytes=KMaxTUint)
+void ThrashPaging(TUint aBytes)
 	{
 	TUint size = LargeBufferSize;
-	if(size>aMaxBytes)
-		size = aMaxBytes;
+	if(size > aBytes)
+		size = aBytes;
 
-	// read all ROM pages about 10 times each in a random order...
+	TUint readCount = 5 * size/PageSize;
+	
+	test.Printf(_L("ThrashPaging %u %u\n"), size, readCount);
+	
 	TUint32 random=1;
-	for(TInt i=size/(PageSize/10); i>0; --i)
+	for(TUint i = 0 ; i < readCount ; ++i)
 		{
 		READ(LargeBuffer+((TInt64(random)*TInt64(size))>>32));
 		random = random*69069+1;
@@ -207,8 +210,51 @@
 	}
 
 
+TInt SetCacheSize(TUint aNewMin, TUint aNewMax)
+	{
+	// set cache size and test 'get' function returns expected values
+	TInt r = DPTest::SetCacheSize(aNewMin, aNewMax);
+	if (r == KErrNone)
+		{
+		TUint min, max, current;
+		test_KErrNone(DPTest::CacheSize(min,max,current));
+		test_Equal(aNewMin, min);
+		test_Equal(aNewMax, max);
+		test(current >= min && current <= max);
+		}
+	return r;
+	}
+
+void DoResizeCache(TUint min, TUint max, TInt result, TUint& sizeMin, TUint& sizeMax, TUint originalMin, TUint originalMax)
+	{
+	test.Printf(_L("DPTest::SetCacheSize min=%u, max=%u, expected result=%d\n"),min/PageSize,max/PageSize,result);
+	TInt r=SetCacheSize(min,max);
+	test_Equal(result, r);
+	if(r==KErrNone)
+		{
+		// we've successfully changed the cache size...
+		if(max)
+			{
+			sizeMin = min;
+			sizeMax = max;
+			}
+		else
+			{
+			sizeMin = originalMin;
+			sizeMax = originalMax;
+			}
+		}
+	else if(r==KErrNoMemory)
+		{
+		// cache size after OOM is unpredictable, so reset our values
+		test_KErrNone(SetCacheSize(sizeMin,sizeMax));
+		}
+	}
+
+
 void TestResizeVMCache()
 	{
+	test.Start(_L("Test resizing VM cache"));
 	TInt r = DPTest::SetCacheSize(0,0); // restore cache size to defaults
 	test(r==KErrNone);
 	TUint sizeMin = 0;
@@ -217,10 +263,42 @@
 	DPTest::CacheSize(sizeMin,sizeMax,currentSize);
 	TUint originalMin = sizeMin;
 	TUint originalMax = sizeMax;
-	test.Printf(_L("original min=%u, original max=%u, current=%u\n"),originalMin/PageSize,originalMax/PageSize,currentSize/PageSize);
+	test.Printf(_L("original min=%u, original max=%u, current=%u\n"),
+				originalMin/PageSize,originalMax/PageSize,currentSize/PageSize);
 
 	int K = currentSize/PageSize+4;
 
+	// Exercise the cache reszing code by testing all valid combinations of the relationships
+	// between the current min size, current max size, new min size and new max size.
+	//
+	// This can be done using four cache size values.  Every assignment of these four values to the
+	// four variables is generated, and invalid combinations rejected.  This repeats some
+	// relationships but is simpler than calculating the minimum set of combinations exactly.
+
+	const TUint combinations = 256;  // 4 ^ 4
+	const TUint sizes[] = { K, K + 4, K + 8, K + 12, K + 16 };
+	for (TUint perm = 0 ; perm < combinations ; ++perm)
+		{
+		TUint vars[4] = { sizes[ perm & 3 ],
+						  sizes[ (perm >> 2) & 3 ],
+						  sizes[ (perm >> 4) & 3 ],
+						  sizes[ (perm >> 6) & 3 ]};
+		if ((vars[0] == vars[2] && vars[1] == vars[3]) || // ensure current != new
+			vars[0] > vars[1] ||                          // ensure current min <= current max
+			vars[2] > vars[3])                            // ensure new min <= new max
+			continue;
+		
+		test.Printf(_L("Test changing cache sizes from %u, %u to %u %u\n"),
+					vars[0], vars[1], vars[2], vars[3]);
+		
+		test_KErrNone(SetCacheSize(PageSize * vars[0], PageSize * vars[1]));
+		ThrashPaging(PageSize * vars[1]);
+		test_KErrNone(SetCacheSize(PageSize * vars[2], PageSize * vars[3]));
+		}
+	test_KErrNone(SetCacheSize(originalMin, originalMax));
+
+	// Now test some more specific resizings
+	
 	struct
 		{
 		TUint iMinPages;
@@ -240,22 +318,20 @@
 			{	K,		K,		KErrNone},
 			{	K+1,	K,		KErrArgument},
 			{	K,		K-1,	KErrArgument},
+			{	K,		K,		KErrNone},
 			{	KMaxTInt,	KMaxTInt,	KErrNoMemory},
 			{	K,		K,		KErrNone},
 
-			{	0,		0,		KErrNone}, // restore defaults
 			{	0,		0,		KMaxTInt} // list end marker
 		};
 
 	for(TInt j=0; j<2; ++j)
 		{
 		if(!j)
-			{
-			test.Start(_L("Changing size of flushed VM cache"));
-			test.Printf(_L("Original cache size min == %u, max == %u\n"),originalMin/PageSize,originalMax/PageSize);
-			}
+			test.Next(_L("Changing size of empty VM cache"));
 		else
 			test.Next(_L("Changing size of full VM cache"));
+		
 		TInt i=0;
 		while(testArgs[i].iResult!=KMaxTInt)
 			{
@@ -263,54 +339,21 @@
 			TUint max=testArgs[i].iMaxPages*PageSize;
 			TInt result=testArgs[i].iResult;
 
-			ThrashPaging(max*2);
 			if(!j)
 				DPTest::FlushCache();
+			else
+				ThrashPaging(max);
 
-			test.Printf(_L("DPTest::SetCacheSize min=%u, max=%u, expected result=%d\n"),min/PageSize,max/PageSize,result);
-			TInt r=DPTest::SetCacheSize(min,max);
-			if(r!=result)
-				{
-				test.Printf(_L("result=%d\n"),r);
-				test(0);
-				}
-			if(r==KErrNone)
-				{
-				// we've successfully changed the cache size...
-				if(max)
-					{
-					sizeMin = min;
-					sizeMax = max;
-					}
-				else
-					{
-					sizeMin = originalMin;
-					sizeMax = originalMax;
-					}
-				}
-			if(r==KErrNoMemory)
-				{
-				// cache size after OOM is unpredictable, so reset our values
-				DPTest::SetCacheSize(sizeMin,sizeMax);
-				}
-			else
-				{
-				// test 'get' function returns expected cache size
-				r=DPTest::CacheSize(min,max,currentSize);
-				test.Printf(_L("DPTest::CacheSize result=%d min=%u max=%u current=%u\n"),r,min/PageSize,max/PageSize,currentSize/PageSize);
-				if(r!=KErrNone || min!=sizeMin || max!=sizeMax)
-					test(0);
-				test(currentSize >= min && currentSize <= max);
-				}
+			DoResizeCache(min, max, result, sizeMin, sizeMax, originalMin, originalMax);
+			
 			++i;
 			}
 		}
-
+	
+	test_KErrNone(SetCacheSize(originalMin, originalMax));
 	test.End();
 	}
 
-
-
 void TestResizeVMCache2()
 	{
 	TUint originalMin = 0;
@@ -1240,6 +1283,8 @@
 	test.Title();
 	
 	test_KErrNone(UserSvr::HalFunction(EHalGroupKernel,EKernelHalPageSizeInBytes,&PageSize,0));
+
+	test.Start(_L("Initialisation"));
 	
 	if (DPTest::Attributes() & DPTest::ERomPaging)
 		test.Printf(_L("Rom paging supported\n"));
@@ -1258,9 +1303,6 @@
 		test(DataPagedChunk.IsPaged()); // this is only ever called if data paging is supported
 		DataPagedBuffer = (TUint8*)DataPagedChunk.Base();
 		}
-		
-	test.Start(_L("Test HAL interface"));
-	TestHAL();
 
 	if (DPTest::Attributes() & DPTest::ERomPaging)
 		{
@@ -1302,6 +1344,9 @@
 		test.End();
 		return 0;
 		}
+		
+	test.Next(_L("Test HAL interface"));
+	TestHAL();
 	
 	test(LargeBufferSize >= KMinBufferSize);
 	SmallBuffer = LargeBuffer;
--- a/kerneltest/e32test/mmu/t_ramall.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/mmu/t_ramall.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -19,11 +19,13 @@
 
 #include <e32test.h>
 #include <e32uid.h>
+#include <hal.h>
 #include <e32hal.h>
 #include <dptest.h>
 #include "d_shadow.h"
 #include "mmudetect.h"
 #include "freeram.h"
+#include "d_gobble.h"
 
 LOCAL_D RTest test(_L("T_RAMALL"));
 
@@ -32,7 +34,7 @@
 TInt PageSize;
 TInt PageShift;
 RShadow Shadow;
-TInt InitFreeRam;
+TInt TotalRam;
 RChunk Chunk;
 TUint ChunkCommitEnd;
 RThread TouchThread;
@@ -46,6 +48,30 @@
 TUint OrigMinCacheSize;
 TUint OrigMaxCacheSize;
 
+//
+// Random number generation
+//
+
+TUint32 RandomSeed;
+
+TUint32 Random()
+	{
+	RandomSeed = RandomSeed*69069+1;
+	return RandomSeed;
+	}
+
+TUint32 Random(TUint32 aRange)
+	{
+	return (TUint32)((TUint64(Random())*TUint64(aRange))>>32);
+	}
+
+void RandomInit(TUint32 aSeed)
+	{
+	RandomSeed = aSeed+(aSeed<<8)+(aSeed<<16)+(aSeed<<24);
+	Random();
+	Random();
+	}
+
 TInt AllocPhysicalRam(TUint32& aAddr, TInt aSize, TInt aAlign)
 	{
 	return Shadow.AllocPhysicalRam(aAddr,aSize,aAlign);
@@ -143,7 +169,7 @@
 
 TInt FillPhysicalRam(TAny* aArgs)
 	{
-	SPhysAllocData& allocData = *((SPhysAllocData*)aArgs);
+	SPhysAllocData allocData = *((SPhysAllocData*)aArgs);
 	TUint maxAllocs = FreeRam() / allocData.iSize;
 	TUint32* physAddrs = new TUint32[maxAllocs + 1];
 	if (!physAddrs)
@@ -165,10 +191,11 @@
 			RDebug::Printf("Error alignment phys addr 0x%08x", *(pa - 1));
 			break;
 			}
-		if (allocData.iCheckFreeRam && freeRam - allocData.iSize != (TUint)FreeRam())
+		TUint newFreeRam = FreeRam();
+		if (allocData.iCheckFreeRam && freeRam - allocData.iSize != newFreeRam)
 			{
 			r = KErrGeneral;
-			RDebug::Printf("Error in free ram 0x%08x orig 0x%08x", FreeRam(), freeRam);
+			RDebug::Printf("Error in free ram 0x%08x orig 0x%08x", newFreeRam, freeRam);
 			break;
 			}
 		}
@@ -187,10 +214,11 @@
 		r = KErrOverflow;
 		RDebug::Printf("Error able to allocate too many pages");
 		}
-	if (allocData.iCheckFreeRam && initialFreeRam != (TUint)FreeRam())
+	TUint finalFreeRam = FreeRam();
+	if (allocData.iCheckFreeRam && initialFreeRam != finalFreeRam)
 		{
 		r = KErrGeneral;
-		RDebug::Printf("Error in free ram 0x%08x initial 0x%08x", FreeRam(), initialFreeRam);
+		RDebug::Printf("Error in free ram 0x%08x initial 0x%08x", finalFreeRam, initialFreeRam);
 		}
 	delete[] physAddrs;
 	if (r != KErrNone && r != KErrNoMemory)
@@ -219,16 +247,18 @@
 	TUint i = 0;
 	for (; i < aNumThreads; i++)
 		{// Need enough heap to store addr of every possible allocation + 1.
-		TUint requiredHeapMax = Max(PageSize, ((InitFreeRam / aSize) / sizeof(TUint32)) + sizeof(TUint32));
+		TUint requiredHeapMax = Max(PageSize, ((TotalRam / aSize) * sizeof(TUint32)) + sizeof(TUint32));
 		TInt r = threads[i].Create(KNullDesC, FillPhysicalRam, KDefaultStackSize, PageSize, requiredHeapMax, (TAny*)&allocData);
-		test_KErrNone(r);
+		if (r != KErrNone)
+			break;			
 		threads[i].Logon(status[i]);
 		}
-	for (i = 0; i < aNumThreads; i++)
+	TUint totalThreads = i;
+	for (i = 0; i < totalThreads; i++)
 		{
 		threads[i].Resume();
 		}
-	for (i = 0; i < aNumThreads; i++)
+	for (i = 0; i < totalThreads; i++)
 		{
 		User::WaitForRequest(status[i]);
 		test_Equal(EExitKill, threads[i].ExitType());
@@ -249,25 +279,33 @@
 
 TInt TouchMemory(TAny*)
 	{
+	RThread::Rendezvous(KErrNone);	// Signal that this thread has started running.
+	RandomInit(TouchData.iSize);
 	while (!TouchDataStop)
 		{
 		TUint8* p = Chunk.Base();
 		TUint8* pEnd = p + ChunkCommitEnd;
 		TUint8* fragPEnd = p + TouchData.iFrequency;
-		for (TUint8* fragP = p + TouchData.iSize; fragPEnd < pEnd;)
+		for (TUint8* fragP = p + TouchData.iSize; fragPEnd < pEnd && !TouchDataStop;)
 			{
 			TUint8* data = fragP;
-			for (; data < fragPEnd; data += PageSize)
+			for (; data < fragPEnd && !TouchDataStop; data += PageSize)
 				{
 				*data = (TUint8)(data - fragP);
+				TUint random = Random();
+				if (random & 0x8484)
+					User::After(random & 0xFFFF);
 				}
-			for (data = fragP; data < fragPEnd; data += PageSize)
+			for (data = fragP; data < fragPEnd && !TouchDataStop; data += PageSize)
 				{
 				if (*data != (TUint8)(data - fragP))
 					{
 					RDebug::Printf("Error unexpected data 0x%x read from 0x%08x", *data, data);
 					return KErrGeneral;
 					}
+				TUint random = Random();
+				if (random & 0x8484)
+					User::After(random & 0xFFFF);
 				}
 			fragP = fragPEnd + TouchData.iSize;
 			fragPEnd += TouchData.iFrequency;
@@ -302,17 +340,14 @@
 		{
 		test_KErrNone(Chunk.Decommit(offset, FragData.iSize));
 		}
-	if (!FragData.iFragThread)
-		test_Equal(FreeRam(), freeBlocks * FragData.iSize);
 
 	if (FragData.iDiscard && CacheSizeAdjustable && !FragThreadStop)
 		{
 		TUint minCacheSize = FreeRam();
 		TUint maxCacheSize = minCacheSize;
-		TUint currentCacheSize;
-		test_KErrNone(DPTest::CacheSize(OrigMinCacheSize, OrigMaxCacheSize, currentCacheSize));
-		test_KErrNone(DPTest::SetCacheSize(minCacheSize, maxCacheSize));
-		test_KErrNone(DPTest::SetCacheSize(OrigMinCacheSize, maxCacheSize));
+		DPTest::SetCacheSize(minCacheSize, maxCacheSize);
+		if (OrigMinCacheSize <= maxCacheSize)
+			DPTest::SetCacheSize(OrigMinCacheSize, maxCacheSize);
 		}
 	}
 
@@ -320,13 +355,14 @@
 void UnfragmentMemoryFunc()
 	{
 	if (FragData.iDiscard && CacheSizeAdjustable)
-		test_KErrNone(DPTest::SetCacheSize(OrigMinCacheSize, OrigMaxCacheSize));
+		DPTest::SetCacheSize(OrigMinCacheSize, OrigMaxCacheSize);
 	Chunk.Decommit(0, Chunk.MaxSize());
 	}
 
 
 TInt FragmentMemoryThreadFunc(TAny*)
 	{
+	RThread::Rendezvous(KErrNone);	// Signal that this thread has started running.
 	while (!FragThreadStop)
 		{
 		FragmentMemoryFunc();
@@ -346,17 +382,22 @@
 	FragData.iFragThread = aFragThread;
 
 	TChunkCreateInfo chunkInfo;
-	chunkInfo.SetDisconnected(0, 0, FreeRam());
+	chunkInfo.SetDisconnected(0, 0, TotalRam);
 	chunkInfo.SetPaging(TChunkCreateInfo::EUnpaged);
+	chunkInfo.SetClearByte(0x19);
 	test_KErrNone(Chunk.Create(chunkInfo));
 
 	if (aFragThread)
 		{
-		TInt r = FragThread.Create(KNullDesC, FragmentMemoryThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL);
+		TInt r = FragThread.Create(_L("FragThread"), FragmentMemoryThreadFunc, KDefaultStackSize, PageSize, PageSize, NULL);
 		test_KErrNone(r);
 		FragThread.Logon(FragStatus);
 		FragThreadStop = EFalse;
+		TRequestStatus threadInitialised;
+		FragThread.Rendezvous(threadInitialised);
 		FragThread.Resume();
+		User::WaitForRequest(threadInitialised);
+		test_KErrNone(threadInitialised.Int());
 		}
 	else
 		{
@@ -366,11 +407,15 @@
 		{
 		TouchData.iSize = aSize;
 		TouchData.iFrequency = aFrequency;
-		TInt r = TouchThread.Create(KNullDesC, TouchMemory, KDefaultStackSize, PageSize, PageSize, NULL);
+		TInt r = TouchThread.Create(_L("TouchThread"), TouchMemory, KDefaultStackSize, PageSize, PageSize, NULL);
 		test_KErrNone(r);
 		TouchThread.Logon(TouchStatus);
 		TouchDataStop = EFalse;
+		TRequestStatus threadInitialised;
+		TouchThread.Rendezvous(threadInitialised);
 		TouchThread.Resume();
+		User::WaitForRequest(threadInitialised);
+		test_KErrNone(threadInitialised.Int());
 		}
 	}
 
@@ -396,6 +441,8 @@
 		}
 	else
 		UnfragmentMemoryFunc();
+	if (CacheSizeAdjustable)
+		test_KErrNone(DPTest::SetCacheSize(OrigMinCacheSize, OrigMaxCacheSize));
 	CLOSE_AND_WAIT(Chunk);
 	}
 
@@ -407,11 +454,12 @@
 	FragmentMemory(aFragSize, aFragFreq, aDiscard, aTouchMemory, EFalse);
 	SPhysAllocData allocData;
 	// Only check free all ram could be allocated in manual tests as fixed pages may be fragmented.
-	allocData.iCheckMaxAllocs = (ManualTest && !aTouchMemory && !aAllocAlign)? ETrue : EFalse;
+	allocData.iCheckMaxAllocs = (ManualTest && !aTouchMemory && !aAllocAlign);
 	allocData.iCheckFreeRam = ETrue;
 	allocData.iSize = aAllocSize;
 	allocData.iAlign = aAllocAlign;
-	FillPhysicalRam(&allocData);
+	TInt r = FillPhysicalRam(&allocData);
+	test_Value(r, r >= 0);
 	UnfragmentMemory(aDiscard, aTouchMemory, EFalse);
 	}
 
@@ -492,14 +540,17 @@
 		ManualTest = cmdLine.Find(KManual) != KErrNotFound;
 		}
 
-	// Turn off lazy dll unloading so the free ram checking isn't affected.
+	// Turn off lazy dll unloading and ensure any supervisor clean up has completed 
+	// so the free ram checking isn't affected.
 	RLoader l;
 	test(l.Connect()==KErrNone);
 	test(l.CancelLazyDllUnload()==KErrNone);
 	l.Close();
+	UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, 0, 0);
 
-	InitFreeRam=FreeRam();
-	test.Printf(_L("Free RAM=%08x, Page size=%x, Page shift=%d\n"),InitFreeRam,PageSize,PageShift);
+	test_KErrNone(HAL::Get(HAL::EMemoryRAM, TotalRam));
+
+	test.Printf(_L("Free RAM=%08x, Page size=%x, Page shift=%d\n"),FreeRam(),PageSize,PageShift);
 
 	test.Next(_L("Open test LDD"));
 	r=Shadow.Open();
@@ -513,6 +564,18 @@
 
 	if (memodel >= EMemModelTypeFlexible)
 		{
+		// To stop these tests taking too long leave only 8MB of RAM free.
+		const TUint KFreePages = 2048;
+		test.Next(_L("Load gobbler LDD"));
+		TInt r = User::LoadLogicalDevice(KGobblerLddFileName);
+		test_Value(r, r == KErrNone || r == KErrAlreadyExists);
+		RGobbler gobbler;
+		r = gobbler.Open();
+		test_KErrNone(r);
+		TUint32 taken = gobbler.GobbleRAM(KFreePages * PageSize);
+		test.Printf(_L("Gobbled: %dK\n"), taken/1024);
+		test.Printf(_L("Free RAM 0x%08X bytes\n"),FreeRam());
+
 		test.Next(_L("TestFragmentedAllocation"));
 		TestFragmentedAllocation();
 
@@ -555,9 +618,15 @@
 		FragmentMemory(PageSize * 32, PageSize * 64, ETrue, EFalse, ETrue);
 		TestMultipleContiguousAllocations(20, PageSize * 1024, PageShift + 10);
 		UnfragmentMemory(ETrue, EFalse, ETrue);
+
+		gobbler.Close();
+		r = User::FreeLogicalDevice(KGobblerLddFileName);
+		test_KErrNone(r);
 		}
 
 	Shadow.Close();
+	r = User::FreeLogicalDevice(KLddFileName);
+	test_KErrNone(r);
 	test.Printf(_L("Free RAM=%08x at end of test\n"),FreeRam());
 	test.End();
 	return(KErrNone);
--- a/kerneltest/e32test/mmu/t_shbuf.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/mmu/t_shbuf.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -624,12 +624,14 @@
 		{
 		RShBuf buf;
 		r = buf.Alloc(aPool);
+		RDebug::Printf("alloc buf %d returned %d", bufarray.Count(), r);
 		if (r==KErrNoMemory && KTestPoolSizeInBufs>bufarray.Count())
 			{
 			// try again after a delay, to allow for background resource allocation
 			
 			User::After(1000000);
 			r = buf.Alloc(aPool);
+			RDebug::Printf("re-alloc buf %d returned %d", bufarray.Count(), r);
 			}
 		if (!r)
 			{
@@ -647,6 +649,7 @@
 		{
 		bufarray[--n].Close();
 		}
+	RDebug::Printf("closed bufs");
 
 	User::After(500000);
 
@@ -655,11 +658,13 @@
 	while (n<bufarray.Count())
 		{
 		r = bufarray[n].Alloc(aPool);
+		RDebug::Printf("alloc buf %d returned %d", n, r);
 		if (r==KErrNoMemory)
 			{
 			// try again after a delay, to allow for background resource allocation
 			User::After(1000000);
 			r = bufarray[n].Alloc(aPool);
+			RDebug::Printf("re-alloc buf %d returned %d", n, r);
 			}
 		test_Assert(r == KErrNone, test.Printf(_L("n=%d r=%d\n"), n, r));
 		if(aligned)
@@ -669,12 +674,14 @@
 
 	RShBuf extrabuf;
 	r = extrabuf.Alloc(aPool);
+	RDebug::Printf("alloc extra buf returned %d", r);
 	test_Equal(KErrNoMemory, r);
 
 	while (n)
 		{
 		bufarray[--n].Close();
 		}
+	RDebug::Printf("closed bufs");
 
 	bufarray.Close();
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/power/d_frqchg.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,421 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\power\d_frqchg.cpp
+// LDD for testing frequency changing
+// 
+//
+
+#include <kernel/kernel.h>
+#include "d_frqchg.h"
+
+#if defined(__EPOC32__) && defined(__SMP__) && defined(__MARM__)
+#define __SUPPORT_LOCAL_TIMER_PRESCALE__
+
+#include <nk_priv.h>
+#include <arm_tmr.h>
+#endif
+
+
+#ifdef __PLATFORM_SUPPORTS_DVFS__
+/**
+  Baseport needs to supply this function to disable DVFS whilst test is running. 
+  The test relies on changing prescalers in local and global timer directly rather than
+  actually changing frequency. Consequently DVFS must be disabled when the test is running
+
+  This function when driver is loaded. 
+  @return KErrNone if succesful
+ */
+extern TInt DisableDvfs();
+
+/**
+   if plaftorm supports DVFS this function will be called when the driver is unloaded
+ */
+extern void RestoreDvfs();
+#endif
+
+
+
+#if defined(__SUPPORT_LOCAL_TIMER_PRESCALE__)
+TInt Multiply(SRatio& aDest, const SRatio& aSrc)
+	{
+	TUint64 x = aDest.iM;
+	TUint64 y = aSrc.iM;
+	x *= y;
+	if (x==0)
+		{
+		aDest.iM = 0;
+		aDest.iX = 0;
+		return KErrNone;
+		}
+	TInt exp = aDest.iX + aSrc.iX + 32;
+	if (TInt64(x) >= 0)
+		x<<=1, --exp;
+	aDest.iM = I64HIGH(x);
+	if (I64LOW(x) & 0x80000000u)
+		{
+		if (++aDest.iM == 0)
+			aDest.iM = 0x80000000u, ++exp;
+		}
+	if (exp > 32767)
+		{
+		aDest.iM = 0xffffffffu;
+		aDest.iX = 32767;
+		return KErrOverflow;
+		}
+	if (exp < -32768)
+		{
+		aDest.iM = 0;
+		aDest.iX = 0;
+		return KErrUnderflow;
+		}
+	aDest.iX = (TInt16)exp;
+	return KErrNone;
+	}
+
+// Calculate frequency ratio for specified prescale value
+// Ratio = (default+1)/(current+1)
+void PrescaleRatio(SRatio& aR, TInt aDefault, TInt aCurrent)
+	{
+	SRatio df;
+	df.Set(TUint32(aDefault+1));
+	aR.Set(TUint32(aCurrent+1));
+	aR.Reciprocal();
+	Multiply(aR, df);
+	}
+#endif
+
+class DFrqChgFactory : public DLogicalDevice
+//
+// Test LDD factory
+//
+	{
+public:
+	DFrqChgFactory();
+	virtual ~DFrqChgFactory();
+	virtual TInt Install(); 					//overriding pure virtual
+	virtual void GetCaps(TDes8& aDes) const;	//overriding pure virtual
+	virtual TInt Create(DLogicalChannelBase*& aChannel); 	//overriding pure virtual
+	};
+
+class DFrqChg : public DLogicalChannelBase
+//
+// Test logical channel
+//
+	{
+public:
+	virtual ~DFrqChg();
+protected:
+	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+	virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
+#if defined(__SUPPORT_LOCAL_TIMER_PRESCALE__)
+	void PopulateDefaultPrescaleList();
+	void SetLocalTimerPrescaler(TUint32 aCpus, TInt aPrescale);
+	TScheduler* iS;
+	TInt iDefaultPrescale[KMaxCpus];
+#if defined(__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK) && defined( __NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+	void SetGlobalTimerPrescaler(TInt aPrescale);
+	TInt iDefaultGTPrescale;
+#endif
+#endif
+
+	};
+
+
+
+DECLARE_STANDARD_LDD()
+	{
+	return new DFrqChgFactory;
+	}
+
+//
+// Constructor
+//
+DFrqChgFactory::DFrqChgFactory()
+	{
+	}
+
+//
+// Destructor, called on unload
+//
+DFrqChgFactory::~DFrqChgFactory()
+	{
+#ifdef __PLATFORM_SUPPORTS_DVFS__
+	RestoreDvfs();
+#endif
+	}
+
+
+
+//
+// Create new channel
+//
+TInt DFrqChgFactory::Create(DLogicalChannelBase*& aChannel)
+	{
+	aChannel=new DFrqChg;
+	return aChannel?KErrNone:KErrNoMemory;
+	}
+
+
+//
+// Install the LDD - overriding pure virtual
+//
+TInt DFrqChgFactory::Install()
+	{
+#ifdef __PLATFORM_SUPPORTS_DVFS__
+	TInt r = DisableDvfs();
+	if (KErrNone != r) return r;
+#endif
+	return SetName(&KLddName);
+	}
+
+
+//
+// Get capabilities - overriding pure virtual
+//
+void DFrqChgFactory::GetCaps(TDes8& /*aDes*/) const
+	{
+	}
+
+
+//
+// Create channel
+//
+TInt DFrqChg::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
+	{
+#if defined(__SUPPORT_LOCAL_TIMER_PRESCALE__)
+	iS = (TScheduler*)TScheduler::Ptr();
+	PopulateDefaultPrescaleList();
+#endif
+	return KErrNone;
+	}
+
+
+//
+// Destructor
+//
+DFrqChg::~DFrqChg()
+	{
+#if defined(__SUPPORT_LOCAL_TIMER_PRESCALE__)
+	// restore prescalers
+	SetLocalTimerPrescaler((TUint32) -1, -1);
+#if defined(__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK) && defined( __NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+	SetGlobalTimerPrescaler(-1);
+#endif
+#endif
+	}
+
+
+TInt DFrqChg::Request(TInt aReqNo, TAny* a1, TAny* a2)
+	{
+	SRatioInv ri;
+	TInt r = KErrNone;
+	switch (aReqNo)
+		{
+		case RFrqChg::EControl_RatioSet:
+			{
+			kumemget32(&ri.iR, a1, sizeof(SRatio));
+			ri.iR.Set(ri.iR.iM, (TUint32)a2);
+			kumemput32(a1, &ri.iR, sizeof(SRatio));
+			break;
+			}
+		case RFrqChg::EControl_RatioReciprocal:
+			{
+			kumemget32(&ri.iR, a1, sizeof(SRatio));
+			r = ri.iR.Reciprocal();
+			kumemput32(a1, &ri.iR, sizeof(SRatio));
+			break;
+			}
+		case RFrqChg::EControl_RatioMult:
+			{
+			kumemget32(&ri.iR, a1, sizeof(SRatio));
+			kumemget32(&ri.iI.iM, a2, sizeof(TUint32));
+			r = ri.iR.Mult(ri.iI.iM);
+			kumemput32(a2, &ri.iI.iM, sizeof(TUint32));
+			break;
+			}
+		case RFrqChg::EControl_RatioInvSet:
+			{
+			SRatio ratio;
+			const SRatio* p = 0;
+			if (a2)
+				{
+				kumemget32(&ratio, a2, sizeof(SRatio));
+				p = &ratio;
+				}
+			ri.Set(p);
+			kumemput32(a1, &ri, sizeof(SRatioInv));
+			break;
+			}
+#if defined(__EPOC32__) && defined(__SMP__) && defined(__MARM__)
+		case RFrqChg::EControl_FrqChgTestPresent:
+			break;
+		case RFrqChg::EControl_SetCurrentThreadPriority:
+			NKern::ThreadSetPriority(NKern::CurrentThread(), (TInt)a1);
+			break;
+		case RFrqChg::EControl_SetCurrentThreadCpu:
+			{
+			TUint32 old = 0;
+			old =  NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), (TUint32)a1);
+			if (a2) 
+				{
+				kumemput32(a2, &old, sizeof(TUint32));
+				}
+			
+			old =  NKern::ThreadSetCpuAffinity(NKern::CurrentThread(), (TUint32)a1);
+			}
+			
+			break;
+		case RFrqChg::EControl_SetCurrentThreadTimeslice:
+			{
+			TInt ts = NKern::TimesliceTicks((TUint32)a1);
+			NKern::ThreadSetTimeslice(NKern::CurrentThread(), ts);
+			NKern::YieldTimeslice();
+			break;
+			}
+#endif
+#if defined(__SUPPORT_LOCAL_TIMER_PRESCALE__)
+		case RFrqChg::EControl_SetLocalTimerPrescaler:
+			{
+			TUint32 cpus = (TUint32)a1;
+			TInt prescale = (TInt)a2;
+			SetLocalTimerPrescaler(cpus, prescale);
+			break;
+			}
+#if defined(__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK) && defined( __NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+	case RFrqChg::EControl_ReadGlobalTimerAndTimestamp:
+		    {
+			ArmGlobalTimer* tmr = iS->iSX.iGlobalTimerAddr;
+			TUint32 highlow[2];
+			do
+				{
+				highlow[1] = tmr->iTimerCountHigh;
+				highlow[0] = tmr->iTimerCountLow;
+				} while(highlow[1]!=tmr->iTimerCountHigh);
+			TUint64 ts = NKern::Timestamp();
+			kumemput32(a1,&highlow[0],sizeof(TUint64));
+			kumemput32(a2,&ts,sizeof(TUint64));
+			break;
+		 }
+	case RFrqChg::EControl_SetGlobalTimerPrescaler:
+		    {
+			SetGlobalTimerPrescaler((TInt)a1);
+			break;
+		 }
+#endif
+#endif
+		default:
+			r = KErrNotSupported;
+			break;
+		}
+	return r;
+	}
+
+
+#if defined(__SUPPORT_LOCAL_TIMER_PRESCALE__)
+void DFrqChg::PopulateDefaultPrescaleList()
+	{
+	TInt nc = NKern::NumberOfCpus();
+	NThread* nt = NKern::CurrentThread();
+	TUint32 aff0 = NKern::ThreadSetCpuAffinity(nt, 0);
+	TInt i;
+	for (i=0; i<nc; ++i)
+		{
+		NKern::ThreadSetCpuAffinity(nt, i);
+		ArmLocalTimer* tmr = (ArmLocalTimer*)iS->iSX.iLocalTimerAddr;
+		TInt pv = (tmr->iTimerCtrl & E_ArmTmrCtrl_PrescaleMask) >> E_ArmTmrCtrl_PrescaleShift;
+		iDefaultPrescale[i] = pv;
+		}
+	NKern::ThreadSetCpuAffinity(nt, aff0);
+#if defined(__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK) && defined( __NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+	ArmGlobalTimer* tmr = iS->iSX.iGlobalTimerAddr;
+	TInt pv = (tmr->iTimerCtrl & E_ArmGTmrCtrl_PrescaleMask) >> E_ArmGTmrCtrl_PrescaleShift;
+	iDefaultGTPrescale = pv;
+#endif
+	}
+
+void DFrqChg::SetLocalTimerPrescaler(TUint32 aCpus, TInt aPrescale)
+	{
+	TInt nc = NKern::NumberOfCpus();
+	NThread* nt = NKern::CurrentThread();
+	TUint32 aff0 = NKern::ThreadSetCpuAffinity(nt, 0);
+	TInt i;
+	for (i=0; i<nc; ++i)
+		{
+		NKern::ThreadSetCpuAffinity(nt, i);
+		}
+	for (i=0; i<nc; ++i)
+		{
+		NKern::ThreadSetCpuAffinity(nt, i);
+		TInt pv = aPrescale;
+		if (pv < 0)
+			pv = iDefaultPrescale[i];
+		if (aCpus & (1u<<i))
+			{
+			TInt irq = NKern::DisableAllInterrupts();
+			ArmLocalTimer* tmr = (ArmLocalTimer*)iS->iSX.iLocalTimerAddr;
+			tmr->iTimerCtrl = (tmr->iTimerCtrl &~ E_ArmTmrCtrl_PrescaleMask) | ((pv << E_ArmTmrCtrl_PrescaleShift) & E_ArmTmrCtrl_PrescaleMask);
+			__e32_io_completion_barrier();
+			NKern::RestoreInterrupts(irq);
+			}
+		}
+	NKern::ThreadSetCpuAffinity(nt, aff0);
+	if (aCpus & 0x80000000u)
+		{
+		// notify nanokernel of frequency changes
+		SVariantInterfaceBlock* vib = iS->iVIB;
+		SRatio ratio[KMaxCpus];
+		for (i=0; i<nc; ++i)
+			{
+			if (aCpus & (1u<<i))
+				{
+				if (aPrescale<0)
+					ratio[i].Set(1);
+				else
+					PrescaleRatio(ratio[i], iDefaultPrescale[i], aPrescale);
+				vib->iTimerFreqR[i] = &ratio[i];
+				}
+			}
+		(*vib->iFrqChgFn)();
+		}
+	}
+
+#if defined(__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK) && defined( __NKERN_TIMESTAMP_USE_SCU_GLOBAL_TIMER__)
+void DFrqChg::SetGlobalTimerPrescaler(TInt aPrescale)
+	{
+	TInt pv = aPrescale;
+	if (pv <= 0)
+		pv = iDefaultGTPrescale;
+
+	ArmGlobalTimer* tmr = iS->iSX.iGlobalTimerAddr;
+	// TInt irq = NKern::DisableAllInterrupts(); 
+	tmr->iTimerCtrl = (tmr->iTimerCtrl &~ E_ArmGTmrCtrl_PrescaleMask) | ((pv << E_ArmGTmrCtrl_PrescaleShift) & E_ArmGTmrCtrl_PrescaleMask);
+	__e32_io_completion_barrier();
+	// NKern::RestoreInterrupts(irq);
+
+	// notify nanokernel of frequency changes
+	SVariantInterfaceBlock* vib = iS->iVIB;
+	SRatio ratio;
+	
+	if (aPrescale<=0)
+		ratio.Set(1);
+	else
+		PrescaleRatio(ratio, iDefaultGTPrescale, aPrescale);
+
+	vib->iGTimerFreqR = &ratio;
+	(*vib->iFrqChgFn)();
+	}
+
+#endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/power/d_frqchg.h	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,107 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\power\d_frqchg.h
+// 
+//
+
+#if !defined(__D_FRQCHG_H__)
+#define __D_FRQCHG_H__
+
+#include <e32cmn.h>
+
+struct SRatio;
+struct SRatioInv;
+
+#ifndef __KERNEL_MODE__
+#include <e32std.h>
+
+struct SRatio
+	{
+	TUint32		iM;		// mantissa, normalised so bit 31=1
+	TInt16		iX;		// -exponent.
+	TUint8		iSpare1;
+	TUint8		iSpare2;
+	};
+
+struct SRatioInv
+	{
+	SRatio		iR;
+	SRatio		iI;
+	};
+#endif
+
+_LIT(KLddName,"D_FRQCHG.LDD");
+
+class RFrqChg : public RBusLogicalChannel
+	{
+public:
+	enum TControl
+		{
+		EControl_RatioSet,
+		EControl_RatioReciprocal,
+		EControl_RatioMult,
+		EControl_RatioInvSet,
+		EControl_FrqChgTestPresent,
+		EControl_SetCurrentThreadPriority,
+		EControl_SetCurrentThreadCpu,
+		EControl_SetCurrentThreadTimeslice,
+		EControl_SetLocalTimerPrescaler,
+		EControl_ReadGlobalTimerAndTimestamp,
+		EControl_SetGlobalTimerPrescaler,
+		ENumControls
+		};
+
+public:
+	inline TInt Open();
+	inline TInt RatioSet(SRatio& aRatio, TUint32 aInt, TInt aDivisorExp=0);
+	inline TInt RatioReciprocal(SRatio& aRatio);
+	inline TInt RatioMult(SRatio& aRatio, TUint32& aInt32);
+	inline TInt RatioInvSet(SRatioInv& aRI, const SRatio* aR);
+	inline TInt FrqChgTestPresent();
+	inline TInt SetCurrentThreadPriority(TInt aPri);
+	inline TInt SetCurrentThreadCpu(TUint32 aCpu, TUint32* aOldAffinity = NULL);
+	inline TInt SetCurrentThreadTimeslice(TInt aSlice);
+	inline TInt SetLocalTimerPrescaler(TUint32 aCpus, TInt aPrescale);
+	inline TInt ReadGlobalTimerAndTimestamp(TUint64& aTimerValue, TUint64& aTimestamp);
+	inline TInt SetGlobalTimerPrescaler(TInt aPrescale);
+	};
+
+#ifndef __KERNEL_MODE__
+inline TInt RFrqChg::Open()
+	{ return DoCreate(KLddName,TVersion(0,1,1),KNullUnit,NULL,NULL); }
+inline TInt RFrqChg::RatioSet(SRatio& aR, TUint32 aInt, TInt aDivisorExp)
+	{ aR.iM=aInt; return DoControl(EControl_RatioSet, (TAny*)&aR, (TAny*)aDivisorExp); }
+inline TInt RFrqChg::RatioReciprocal(SRatio& aR)
+	{ return DoControl(EControl_RatioReciprocal, (TAny*)&aR); }
+inline TInt RFrqChg::RatioMult(SRatio& aR, TUint32& aInt32)
+	{ return DoControl(EControl_RatioMult, (TAny*)&aR, (TAny*)&aInt32); }
+inline TInt RFrqChg::RatioInvSet(SRatioInv& aRI, const SRatio* aR)
+	{ return DoControl(EControl_RatioInvSet, (TAny*)&aRI, (TAny*)aR); }
+inline TInt RFrqChg::FrqChgTestPresent()
+	{ return DoControl(EControl_FrqChgTestPresent); }
+inline TInt RFrqChg::SetCurrentThreadPriority(TInt aPri)
+	{ return DoControl(EControl_SetCurrentThreadPriority, (TAny*)aPri); }
+inline TInt RFrqChg::SetCurrentThreadCpu(TUint32 aCpu, TUint32* aOldAffinity)
+	{ return DoControl(EControl_SetCurrentThreadCpu, (TAny*)aCpu, (TAny*) aOldAffinity); }
+inline TInt RFrqChg::SetCurrentThreadTimeslice(TInt aSlice)
+	{ return DoControl(EControl_SetCurrentThreadTimeslice, (TAny*)aSlice); }
+inline TInt RFrqChg::SetLocalTimerPrescaler(TUint32 aCpus, TInt aPrescale)
+	{ return DoControl(EControl_SetLocalTimerPrescaler, (TAny*)aCpus, (TAny*)aPrescale); }
+inline TInt RFrqChg::ReadGlobalTimerAndTimestamp(TUint64& aTimerValue, TUint64& aTimestamp)
+	{ return DoControl(EControl_ReadGlobalTimerAndTimestamp, (TAny*)&aTimerValue, (TAny*) &aTimestamp); }
+inline TInt RFrqChg::SetGlobalTimerPrescaler(TInt aPrescale)
+	{ return DoControl(EControl_SetGlobalTimerPrescaler, (TAny*)aPrescale); }
+#endif
+
+#endif   //__D_FRQCHG_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/power/t_frqchg.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,775 @@
+// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\power\t_frqchg.cpp
+//
+//
+
+#define __E32TEST_EXTENSION__
+#include <e32test.h>
+#include <e32math.h>
+#include <e32atomics.h>
+#include <hal.h>
+#include "d_frqchg.h"
+#include <e32svr.h>
+#include "u32std.h"
+
+RFrqChg Driver;
+RTest test(_L("T_FRQCHG"));
+
+// test will fail if slice is > (expected+KSliceDeltaPercent%of expexted) 
+// or < (expected-KSliceDeltaPercent%expected)
+const TInt KSliceDeltaPercent = 5;   
+// test will fail for global timer based timestamps if interval measured 
+// is > (expected+KTimeStampDeltaPercent%of expexted) 
+// or < (expected-KTimeStampDeltaPercent%expected)
+const TInt KTimeStampDeltaPercent = 5;
+
+TInt RealToRatio(SRatio& aRatio, const TRealX& aReal)
+	{
+	aRatio.iSpare1 = 0;
+	aRatio.iSpare2 = 0;
+	if (aReal.iSign || aReal.IsZero() || aReal.IsNaN())
+		{
+		aRatio.iM = 0;
+		aRatio.iX = 0;
+		return (aReal.IsZero()) ? KErrNone : KErrNotSupported;
+		}
+	TRealX rx(aReal);
+	TRealX rr(rx);
+	rr.iExp -= 32;
+	rr.iMantLo = 0;
+	rr.iMantHi = 0x80000000u;
+	rx += rr;	// rounding
+	TInt exp = rx.iExp - 32767 - 31;
+	if (exp < -32768)
+		{
+		aRatio.iM = 0;
+		aRatio.iX = 0;
+		return KErrUnderflow;
+		}
+	if (exp > 32767)
+		{
+		aRatio.iM = 0xffffffffu;
+		aRatio.iX = 32767;
+		return KErrOverflow;
+		}
+	aRatio.iM = rx.iMantHi;
+	aRatio.iX = (TInt16)exp;
+	return KErrNone;
+	}
+
+TInt RatioToReal(TRealX& a, const SRatio& aRatio)
+	{
+	a.iSign = 0;
+	a.iFlag = 0;
+	a.iMantLo = 0;
+	a.iMantHi = aRatio.iM;
+	if (!aRatio.iM)
+		{
+		a.SetZero();
+		return KErrNone;
+		}
+	TInt exp = aRatio.iX + 31 + 32767;
+	if (exp > 65534)
+		{
+		a.SetInfinite(EFalse);
+		}
+	else
+		{
+		a.iExp = (TUint16)exp;
+		}
+	return KErrNone;
+	}
+
+TInt RatioSetValue(TRealX& a, TUint32 aInt, TInt aDivisorExp)
+	{
+	a.Set(TUint(aInt));
+	TInt exp = a.iExp;
+	exp -= aDivisorExp;
+	if (exp<1)
+		{
+		a.SetZero();
+		return KErrUnderflow;
+		}
+	if (exp>65534)
+		{
+		a.SetInfinite(EFalse);
+		return KErrOverflow;
+		}
+	a.iExp = (TInt16)exp;
+	return KErrNone;
+	}
+
+TInt RatioReciprocal(SRatio& aRatio)
+	{
+	TRealX rx;
+	TInt r = RatioToReal(rx, aRatio);
+	if (r != KErrNone)
+		return r;
+	rx = TRealX(1) / rx;
+	return RealToRatio(aRatio, rx);
+	}
+
+TInt RatioMult(const SRatio& aRatio, TUint32& aInt32)
+	{
+	TRealX rx;
+	TInt r = RatioToReal(rx, aRatio);
+	if (r != KErrNone)
+		return r;
+	r = rx.MultEq(TRealX((TUint)aInt32));
+	if (r != KErrNone)
+		return r;
+	if (rx.IsZero())
+		{
+		aInt32 = 0;
+		return KErrNone;
+		}
+	rx.AddEq(TRealX(0.5));
+	if (rx<TRealX(1))
+		{
+		aInt32 = 0;
+		return KErrUnderflow;
+		}
+	if (rx.iExp > 32767+31)
+		{
+		aInt32 = ~0u;
+		return KErrOverflow;
+		}
+	aInt32 = rx.operator TUint();
+	return KErrNone;
+	}
+
+void RatioPrint(const char* aTitle, const SRatio& aRatio)
+	{
+	TPtrC8 t8((const TUint8*)aTitle);
+	TBuf<256> t16;
+	t16.Copy(t8);
+	test.Printf(_L("%S: %08x %04x\n"), &t16, aRatio.iM, TUint16(aRatio.iX));
+	}
+
+void RatioPrint2(const char* aTitle, const SRatio& aR1, const SRatio& aR2)
+	{
+	TPtrC8 t8((const TUint8*)aTitle);
+	TBuf<256> t16;
+	t16.Copy(t8);
+	test.Printf(_L("%S: %08x %04x   %08x %04x\n"), &t16, aR1.iM, TUint16(aR1.iX), aR2.iM, TUint16(aR2.iX));
+	}
+
+void TestEqual(const SRatio& aActual, const SRatio& aExpected)
+	{
+	if (aActual.iM==aExpected.iM && aActual.iX==aExpected.iX)
+		return;
+	RatioPrint("Actual", aActual);
+	RatioPrint("Expected", aExpected);
+	test(0);
+	}
+
+const TUint32 MultTestIntegers[] =
+	{
+	0u, 1u, 2u, 3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u, 29u, 31u, 37u, 41u, 43u, 47u,
+	50u, 51u, 53u, 59u, 61u, 63u, 67u, 71u, 72u, 81u, 100u, 127u, 133u, 187u, 200u,
+	4u, 8u, 16u, 32u, 64u, 128u, 256u, 512u, 1024u, 2048u, 4096u, 8192u, 16384u,
+	32768u, 65536u, 131072u, 262144u, 524288u, 1048576u, 2097152u, 4194304u, 8388608u,
+	16777216u, 33554432u, 67108864u, 134217728u, 268435456u, 536870912u, 1073741824u,
+	2147483648u, 4294967295u,
+	9u, 27u, 243u, 729u, 2187u, 6561u, 19683u, 59049u, 177147u, 531441u, 1594323u,
+	4782969u, 14348907u, 43046721u, 129140163u, 387420489u, 1162261467u, 3486784401u,
+	25u, 125u, 625u, 3125u, 15625u, 78125u, 390625u, 1953125u, 9765625u,
+	48828125u, 244140625u, 1220703125u,
+	49u, 343u, 2401u, 16807u, 117649u, 823543u, 5764801u, 40353607u, 282475249u, 1977326743u
+	};
+
+void Test1M(const SRatio& aRatio)
+	{
+	SRatio ratio = aRatio;
+	const TInt N = sizeof(MultTestIntegers)/sizeof(MultTestIntegers[0]);
+	test.Printf(_L("Testing %d integers\n"), N);
+	TInt i;
+	for (i=0; i<N; ++i)
+		{
+		TUint32 I = MultTestIntegers[i];
+		TUint32 I0 = I;
+		TUint32 I1 = I;
+		TInt r0 = RatioMult(aRatio, I0);
+		TInt r1 = Driver.RatioMult(ratio, I1);
+		if (r0!=KErrNone || r1!=KErrNone)
+			{
+			if (r0!=r1)
+				{
+				test.Printf(_L("Return code mismatch r0=%d r1=%d (I=%08x I0=%08x I1=%08x)\n"), r0, r1, I, I0, I1);
+				test(0);
+				}
+			}
+		else if (I0!=I1)
+			{
+			test.Printf(_L("Result mismatch I=%08x I0=%08x I1=%08x\n"), I, I0, I1);
+			}
+		}
+	}
+
+void Test1(TUint32 aInt, TInt aDivisorExp)
+	{
+	TRealX realx;
+	SRatio r0x;
+	SRatio r0;
+	SRatio r1x;
+	SRatio r1;
+	TInt r;
+	test.Printf(_L("Test1 %08x %d\n"), aInt, aDivisorExp);
+	r = RatioSetValue(realx, aInt, aDivisorExp);
+	test_KErrNone(r);
+	r = RealToRatio(r0x, realx);
+	test_KErrNone(r);
+	r = Driver.RatioSet(r0, aInt, aDivisorExp);
+	RatioPrint2("R0X,R0", r0x, r0);
+	TestEqual(r0, r0x);
+	Test1M(r0);
+	r1x = r0x;
+	r = RatioReciprocal(r1x);
+	test_KErrNone(r);
+	r1 = r0;
+	r = Driver.RatioReciprocal(r1);
+	test_KErrNone(r);
+	RatioPrint2("R1X,R1", r1x, r1);
+	TestEqual(r1, r1x);
+	Test1M(r1);
+	}
+
+void TestRatios()
+	{
+	Test1(1,0);
+	Test1(3,0);
+	Test1(0xb504f334u,32);
+	Test1(0xc90fdaa2u,30);
+	Test1(10,0);
+	Test1(0xcccccccd,35);
+	Test1(100,0);
+	Test1(0xa3d70a3d,38);
+	}
+
+class CircBuf
+	{
+public:
+	static CircBuf* New(TInt aSlots);
+	CircBuf();
+	~CircBuf();
+	TInt TryPut(TUint32 aIn);
+	void Reset();
+public:
+	volatile TUint32* iBufBase;
+	TUint32 iSlotCount;
+	volatile TUint32 iPutIndex;
+	};
+
+CircBuf* CircBuf::New(TInt aSlots)
+	{
+	test(TUint32(aSlots-1)<65536);
+	CircBuf* p = new CircBuf();
+	p->iSlotCount = aSlots;
+	p->iPutIndex = 0;
+	p->iBufBase = (TUint32*)User::Alloc(aSlots*sizeof(TUint32));
+	if (!p->iBufBase)
+		{
+		delete p;
+		p = 0;
+		}
+	__e32_memory_barrier();
+	return p;
+	}
+
+CircBuf::CircBuf()
+	{
+	iBufBase = 0;
+	}
+
+CircBuf::~CircBuf()
+	{
+	User::Free((TAny*)iBufBase);
+	}
+
+TInt CircBuf::TryPut(TUint32 aIn)
+	{
+	TUint32 orig = __e32_atomic_tau_rlx32(&iPutIndex, iSlotCount, 0, 1);
+	if (orig == iSlotCount)
+		return KErrOverflow;
+	iBufBase[orig] = aIn;
+	return KErrNone;
+	}
+
+void CircBuf::Reset()
+	{
+	__e32_atomic_store_ord32(&iPutIndex, 0);
+	}
+
+
+
+class CTimesliceTestThread : public CBase
+	{
+public:
+	CTimesliceTestThread();
+	~CTimesliceTestThread();
+	static CTimesliceTestThread* New(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf);
+	void Start();
+	void Wait();
+	TBool Finished();
+	TInt Construct(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf);
+	static TInt ThreadFunc(TAny*);
+public:
+	RThread	iThread;
+	TRequestStatus iExitStatus;
+	TUint32 iId;
+	CircBuf* iBuf;
+	TUint32 iFreq;
+	TUint32 iThresh;
+	TUint32 iThresh2;
+	TInt iCpu;
+	TInt iSlice;
+	};
+
+CTimesliceTestThread::CTimesliceTestThread()
+	{
+	iThread.SetHandle(0);
+	}
+
+CTimesliceTestThread::~CTimesliceTestThread()
+	{
+	if (iThread.Handle())
+		{
+		if (iThread.ExitType() == EExitPending)
+			{
+			iThread.Kill(0);
+			Wait();
+			}
+		CLOSE_AND_WAIT(iThread);
+		}
+	}
+
+TInt CTimesliceTestThread::Construct(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf)
+	{
+	iId = aId;
+	iCpu = aCpu;
+	iSlice = aSlice;
+	iBuf = aBuf;
+
+	TInt r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)iFreq);
+	if (r!=KErrNone)
+		return r;
+	iThresh = iFreq / 3000;
+	if (iThresh < 10)
+		iThresh = 10;
+	iThresh2 = iFreq;
+	TBuf<16> name = _L("TSThrd");
+	name.AppendNum(iId);
+	r = iThread.Create(name, &ThreadFunc, 0x1000, NULL, this);
+	if (r!=KErrNone)
+		return r;
+	iThread.Logon(iExitStatus);
+	if (iExitStatus != KRequestPending)
+		{
+		iThread.Kill(0);
+		iThread.Close();
+		iThread.SetHandle(0);
+		return iExitStatus.Int();
+		}
+	return KErrNone;
+	}
+
+CTimesliceTestThread* CTimesliceTestThread::New(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf)
+	{
+	CTimesliceTestThread* p = new CTimesliceTestThread;
+	if (p)
+		{
+		TInt r = p->Construct(aId, aCpu, aSlice, aBuf);
+		if (r != KErrNone)
+			{
+			delete p;
+			p = 0;
+			}
+		}
+	return p;
+	}
+
+void CTimesliceTestThread::Start()
+	{
+	iThread.Resume();
+	}
+
+TBool CTimesliceTestThread::Finished()
+	{
+	return (KRequestPending!=iExitStatus.Int());
+	}
+
+void CTimesliceTestThread::Wait()
+	{
+	User::WaitForRequest(iExitStatus);
+	}
+
+TInt CTimesliceTestThread::ThreadFunc(TAny* aPtr)
+	{
+	CTimesliceTestThread& a = *(CTimesliceTestThread*)aPtr;
+	Driver.SetCurrentThreadCpu(a.iCpu);
+	Driver.SetCurrentThreadPriority(63);
+	Driver.SetCurrentThreadTimeslice(a.iSlice);
+	User::AfterHighRes(100000);
+	TUint id = a.iId;
+	TUint32 last_interval_begin = User::FastCounter();
+	TUint32 last_seen_time = User::FastCounter();
+	FOREVER
+		{
+		TUint32 nfc = User::FastCounter();
+		TUint32 delta = nfc - last_seen_time;
+		TUint32 interval_length = last_seen_time - last_interval_begin;
+		if (delta > a.iThresh || interval_length > a.iThresh2)
+			{
+			last_interval_begin = nfc;
+			TUint32 x = (id<<30) | (interval_length&0x3fffffffu);
+			TInt r = a.iBuf->TryPut(x);
+			if (r != KErrNone)
+				break;
+			}
+		last_seen_time = nfc;
+		}
+	return KErrNone;
+	}
+
+CircBuf* RunTimesliceTest(TInt aCpu, TInt aSlice, TInt aCount, TInt aInterfere = 0)
+ 	{
+	TUint32 oldaff = 0;
+	TUint32 interfereAffinity = 0; 
+	TUint tellKernel = 0x80000000u;
+	
+	CircBuf* buf = CircBuf::New(aCount);
+	test(buf != 0);
+	CTimesliceTestThread* t0 = CTimesliceTestThread::New(0, aCpu, aSlice, buf);
+	test(t0 != 0);
+	CTimesliceTestThread* t1 = CTimesliceTestThread::New(1, aCpu, aSlice, buf);
+	test(t1 != 0);
+
+	if (aInterfere) 
+		{
+		if (aInterfere < 0) 
+			{
+			tellKernel = 0;
+			}
+		TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
+		test(r>0);
+		interfereAffinity = (0x80000000 | ((0x1<<r)-1)) & ~0x2; // all except core 1
+		if (0x80000001 == interfereAffinity) 
+			{
+			interfereAffinity = 0;   // dual core system (not doing this fails affinity check later)
+			}
+		
+		Driver.SetCurrentThreadCpu(interfereAffinity , &oldaff);   // move away from core 1 (doesn't hurt though not much difference gained)
+		Driver.SetCurrentThreadPriority(63);                       // changing prescaler requires running on core 1 so priority needs to 
+		}                                                          // match test threads
+
+
+	t0->Start();
+	t1->Start();
+	if (aInterfere) 
+		{
+		TInt prescale = 1;
+		while (!t0->Finished() || !t1->Finished()) 
+			{
+			User::AfterHighRes(23000);
+			Driver.SetLocalTimerPrescaler((1u<<1)|tellKernel, prescale);
+			prescale++;
+			if (prescale >  4) 
+				{
+				prescale = 0;
+				}
+			}
+		}
+
+	t0->Wait();
+	t1->Wait();
+	
+	delete t0;
+	delete t1;
+	if (aInterfere) 
+		{
+		TUint32 aff;
+		Driver.SetLocalTimerPrescaler((1u<<1)|0x80000000u, -1);
+		RThread().SetPriority(EPriorityNormal);
+		Driver.SetCurrentThreadCpu(oldaff,&aff);
+		test_Equal(aff,interfereAffinity);
+		}
+	return buf;
+	}
+
+TUint32 ticks_to_us(TUint32 aTicks, TUint32 aF)
+	{
+	TUint64 x = TUint64(aTicks) * TUint64(1000000);
+	TUint64 f64 = aF;
+	x += (f64>>1);
+	x /= f64;
+	return I64LOW(x);
+	}
+
+void DisplayBuffer(CircBuf* aBuf, TUint32 aSlice )
+	{
+	TUint32 f;
+	TInt r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)f);
+	test_KErrNone(r);
+	TUint32* p = (TUint32*)aBuf->iBufBase;
+	TInt c = aBuf->iSlotCount;
+	TInt i;
+	TInt lid = -1;
+	TUint32 min = ~0u;
+	TUint32 max = 0;
+	TUint32 totivus = 0;
+	TBool firstchg = ETrue;
+	for (i=0; i<c; ++i)
+		{
+		TUint32 x = p[i];
+		TUint32 id = x>>30;
+		TUint32 iv = (x<<2)>>2;
+		TUint32 ivus = ticks_to_us(iv,f);
+		if (lid >= 0)
+			{
+			if (lid == (TInt)id)
+				totivus += ivus;
+			else
+				{
+				if (!firstchg)
+					{
+					if (totivus < min)
+						min = totivus;
+					if (totivus > max)
+						max = totivus;
+					}
+				else
+					firstchg = EFalse;
+				totivus = ivus;
+				}
+			}
+		lid = (TInt)id;
+		test.Printf(_L("ID: %1d IV: %10d (=%10dus) TIV %10dus\n"), id, iv, ivus, totivus);
+		}
+
+	if (aSlice > 0)
+		{
+		// check timeslices where within acceptable ranges
+		TUint32 sliceError = KSliceDeltaPercent*aSlice/100;
+		test_Compare(max,<,aSlice+sliceError);  
+		test_Compare(min,>,aSlice-sliceError);  
+		}
+	test.Printf(_L("RANGE %d-%dus (%dus)\n"), min, max, max-min);
+	}
+
+void TT()
+	{
+	test.Printf(_L("Timeslicing test ...\n"));
+	CircBuf* b = RunTimesliceTest(1, 50000, 100);
+	test.Next(_L("Baseline - expecting normal"));
+	DisplayBuffer(b,50000u);
+	delete b;
+
+	Driver.SetLocalTimerPrescaler(1u<<1, 1);
+	b = RunTimesliceTest(1, 50000, 100);
+	test.Next(_L("expecting double"));
+	DisplayBuffer(b,100000u);
+	delete b;
+
+	Driver.SetLocalTimerPrescaler(1u<<1|0x80000000u, 1);
+	test.Next(_L("expecting normal again"));
+	b = RunTimesliceTest(1, 50000, 100);
+	DisplayBuffer(b,50000u);
+	delete b;
+
+	test.Next(_L("expecting half"));
+	Driver.SetLocalTimerPrescaler(1u<<1, -1);
+	b = RunTimesliceTest(1, 50000, 100);
+	DisplayBuffer(b,25000u);
+	delete b;
+
+	Driver.SetLocalTimerPrescaler(1u<<1|0x80000000u, -1);
+	test.Next(_L("expecting normal again"));
+	b = RunTimesliceTest(1, 50000, 100);
+	DisplayBuffer(b,50000u);
+	delete b;
+
+	b = RunTimesliceTest(1, 50000, 200 ,-1);
+	test.Next(_L("expecting random"));
+	DisplayBuffer(b,0u);  // timeslices should be fairly random on this run
+
+	b = RunTimesliceTest(1, 50000, 200 ,1);
+	test.Next(_L("expecting normal again"));
+	DisplayBuffer(b,50000u);
+	delete b;
+	}
+
+struct SGTRecord
+	{
+	TUint64 iTSInterval;
+	TUint64 iGTInterval;
+	};
+
+
+SGTRecord* RunGTTest(TInt aCount, TInt aWait)
+	{
+	TUint64 lastgt,lastts,gt,ts;
+
+	SGTRecord* res = new SGTRecord[aCount];
+	test(res!=0);
+
+
+	TInt r = Driver.ReadGlobalTimerAndTimestamp(lastgt,lastts);
+	test_Equal(r,KErrNone);
+
+	for (TInt i = 0; i < aCount; i++) 
+		{
+		User::AfterHighRes(aWait);
+		
+		TInt r = Driver.ReadGlobalTimerAndTimestamp(gt,ts);
+		test_Equal(r,KErrNone);
+		res[i].iGTInterval = gt-lastgt;
+		lastgt = gt;
+		res[i].iTSInterval = ts-lastts;
+		lastts = ts;
+		}
+
+	return res;
+	}
+
+void DisplayGTResults(SGTRecord* aRec, TInt aCount, TUint32 aFreq, TUint64 aExpectedTSInterval, TUint64 aExpectedGTInterval)
+	{
+	SGTRecord max = { 0ul , 0ul };
+	SGTRecord min = { KMaxTUint64 , KMaxTUint64 };
+	
+	TUint64 errgt = (aExpectedGTInterval*KTimeStampDeltaPercent)/100;
+	TUint64 errts = (aExpectedTSInterval*KTimeStampDeltaPercent)/100;
+
+	
+	for (TInt i = 0 ; i < aCount; i++) 
+		{
+		test.Printf(_L("gt interval : %Lu (gtticks) %Lu (us)\n"),
+					aRec[i].iGTInterval,
+					aRec[i].iTSInterval*1000000u/TUint64(aFreq));
+		
+		if (max.iTSInterval < aRec[i].iTSInterval) 
+			{
+			max.iTSInterval = aRec[i].iTSInterval;
+			}
+		if (max.iGTInterval < aRec[i].iGTInterval) 
+			{
+			max.iGTInterval = aRec[i].iGTInterval;
+			}
+		
+		if (min.iTSInterval > aRec[i].iTSInterval) 
+			{
+			min.iTSInterval = aRec[i].iTSInterval;
+			}
+		if (min.iGTInterval > aRec[i].iGTInterval) 
+			{
+			min.iGTInterval = aRec[i].iGTInterval;
+			}
+		}
+	
+	test.Printf(_L("RANGE Global Timer %Lu-%Lu ticks (%Lu ticks)\n"),
+				min.iGTInterval, max.iGTInterval, max.iGTInterval-min.iGTInterval);
+	
+	test.Printf(_L("RANGE Timestamp %Lu-%Lu us (%Lu us)\n"),
+				(1000000u*min.iGTInterval)/TUint64(aFreq), (1000000u*max.iGTInterval)/TUint64(aFreq),
+				(1000000u*max.iGTInterval)/TUint64(aFreq) - (1000000u*min.iGTInterval)/TUint64(aFreq));
+	
+	if (errts) 
+		{
+		test_Compare(max.iTSInterval,<,aExpectedTSInterval+errts);  
+		test_Compare(min.iTSInterval,>,aExpectedTSInterval);  
+		}
+	
+	if (errgt) 
+		{
+		test_Compare(max.iGTInterval,<,aExpectedGTInterval+errgt);  
+		test_Compare(min.iGTInterval,>,aExpectedGTInterval);  
+		}
+	
+	}
+
+void GTT()
+	{
+	test.Printf(_L("Global timer tests ...\n"));
+	TUint64 gt,ts;
+
+	TInt r = Driver.ReadGlobalTimerAndTimestamp(gt,ts);
+	if (KErrNotSupported == r ) 
+		{
+		test.Printf(_L("Global timer not supported in this plaform, skipping GT tests\n"));
+		return;
+		}
+
+	TUint32 f;
+	r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)f);
+	test_KErrNone(r);
+	TInt wait = 100000; // 100ms
+	TInt count = 10;
+	
+	TUint64 expectedTs = (TUint64(f)*TUint64(wait))/1000000u;
+	TUint64 expectedGtOrig = expectedTs;
+	
+	SGTRecord* rec;
+	for (TInt i = 0; i < 10; i++)
+		{
+		TUint64 expectedGt = expectedGtOrig/(i+1);
+		r = Driver.SetGlobalTimerPrescaler(i);
+		test_KErrNone(r);
+		rec = RunGTTest(count, wait);
+		test.Printf(_L("expectedTS %Lu expectedGT %Lu\n"),expectedTs,expectedGt);
+		DisplayGTResults(rec,count, f, expectedTs , expectedGt);
+		delete rec;
+		}
+
+	r = Driver.SetGlobalTimerPrescaler(-1); // back to default
+	test_KErrNone(r);
+	}
+
+void RunTests()
+	{
+	TestRatios();
+	if (Driver.FrqChgTestPresent()!=KErrNone)
+		{
+		test.Printf(_L("Frequency Change not supported on this platform\n"));
+		return;
+		}
+	TT();
+	GTT();
+	}
+
+GLDEF_C TInt E32Main()
+	{
+	test.Title();
+	test.Start(_L("Testing"));
+	TInt r = User::LoadLogicalDevice(KLddName);
+	if (r==KErrNotFound)
+		{
+		test.Printf(_L("Test not supported on this platform\n"));
+		}
+	else 
+		{
+		if (r!=KErrNone)
+			{
+			test_Equal(KErrAlreadyExists, r);
+			}
+		r = Driver.Open();
+		test_KErrNone(r);
+		RunTests();
+		Driver.Close();
+		}
+
+	test.End();
+	r = User::FreeLogicalDevice(KLddName);
+	test_KErrNone(r);
+	return KErrNone;
+	}
--- a/kerneltest/e32test/prime/t_semutx.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32test/prime/t_semutx.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -40,7 +40,9 @@
 
 #define __E32TEST_EXTENSION__
 #include <e32test.h>
-#include <u32std.h>
+#include <hal.h>
+#include <e32atomics.h>
+#include <u32hal.h>
 #include <e32svr.h>
 
 const TInt KMaxBufferSize=10;
@@ -51,13 +53,352 @@
 
 RTest test(_L("T_SEMUTX"));
 RMutex mutex;
-RCriticalSection criticalSn;	
+RCriticalSection criticalSn;
 TInt thread1Count,thread2Count;
 TInt arrayIndex;
-TInt array[KMaxArraySize];  
+TInt array[KMaxArraySize];
 TInt consumerArray[KNumProducerItems];
-RSemaphore slotAvailable,itemAvailable;  
+RSemaphore slotAvailable,itemAvailable;
+TBool doCpuLocking = EFalse;
+
+// return num of cpus in system
+TInt NumCpus()
+	{
+	TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
+	return r;
+	}
+
+
+TInt LockCurrentThreadToCpu0(TBool aCallingIsMainTestThread = EFalse)
+	{
+	if (aCallingIsMainTestThread) 
+		{
+		if (NumCpus() > 1) 
+			{
+			doCpuLocking = ETrue;
+			return UserSvr::HalFunction(EHalGroupKernel, EKernelHalLockThreadToCpu, 0, 0); 
+			}
+		else
+			{
+			return KErrNone;
+			}
+		}
+	return UserSvr::HalFunction(EHalGroupKernel, EKernelHalLockThreadToCpu, 0, 0); 
+	}
+
+TInt UnlockCurrentThreadToCpu0(TBool aCallingIsMainTestThread = EFalse)
+	{
+	if (aCallingIsMainTestThread) 
+		{
+		if (NumCpus() > 1) 
+			{
+			doCpuLocking = EFalse;
+			return UserSvr::HalFunction(EHalGroupKernel, EKernelHalLockThreadToCpu, (TAny*) 0xffffffffu, 0); 
+			}
+		else
+			{
+			return KErrNone;
+			}
+		}
+	return UserSvr::HalFunction(EHalGroupKernel, EKernelHalLockThreadToCpu, (TAny*) 0xffffffffu, 0); 
+	}
+
+
+/******************************************************************************
+ * Random Number Generation
+ ******************************************************************************/
+void Random(TUint64& a)
+	{
+	TInt i;
+	for (i=64; i>0; --i)
+		{
+		TUint64 x = a<<1;
+		TUint64 y = x<<1;
+		x^=y;
+		a = (y>>1) | (x>>63);
+		}
+	}
+
+// Returns 256*log2(a/2^64)
+TInt Log2(TUint64 a)
+	{
+	const TUint64 KBit63 = UI64LIT(0x8000000000000000);
+	TInt n = __e32_find_ms1_64(a);
+	a <<= (63-n);
+	n -= 64;
+	TInt i;
+	for (i=0; i<8; ++i)
+		{
+		a >>= 32;
+		a *= a;
+		n <<= 1;
+		if (a & KBit63)
+			{
+			++n;
+			}
+		else
+			{
+			a <<= 1;
+			}
+		}
+	return n;
+	}
+
+TUint32 ExpRV(TUint64 aU, TUint32 aMean, TUint32 aTick)
+	{
+	TInt n = -Log2(aU);
+	TUint64 x = TUint64(n) * TUint64(aMean);
+	x *= TUint64(22713);	// 2^15 * ln2
+	TUint64 p(aTick);
+	p <<= 22;
+	x += p;
+	p += p;
+	x /= p;
+	return I64LOW(x);
+	}
+
+
+
+/*----------------------------------------------------------------------------*/
+class MLock
+	{
+public:
+	enum {EPollable=1, ETimeoutAvail=2, ENestable=4, ELimit1=8, ELooseTimeout=16};
+public:
+	virtual TInt Flags()=0;
+	virtual void Release()=0;
+	virtual void Wait()=0;
+	virtual void Signal()=0;
+	virtual TInt Wait(TInt aTimeout);
+	virtual TInt Poll();
+	};
+
+TInt MLock::Wait(TInt)
+	{ return KErrNotSupported; }
+TInt MLock::Poll()
+	{ return KErrNotSupported; }
+
+/*----------------------------------------------------------------------------*/
+class LockS : public MLock
+	{
+public:
+	LockS();
+	virtual TInt Flags();
+	virtual void Release();
+	virtual void Wait();
+	virtual void Signal();
+	virtual TInt Wait(TInt aTimeout);
+	virtual TInt Poll();
+public:
+	RSemaphore	iT;
+	};
+
+LockS::LockS()
+	{ test_KErrNone(iT.CreateLocal(1)); }
+TInt LockS::Flags()
+	{ return EPollable|ETimeoutAvail; }
+void LockS::Release()
+	{ iT.Close(); }
+void LockS::Wait()
+	{ iT.Wait(); }
+void LockS::Signal()
+	{ iT.Signal(); }
+TInt LockS::Wait(TInt aTimeout)
+	{ return iT.Wait(aTimeout); }
+TInt LockS::Poll()
+	{ return iT.Poll(); }
+
+/*----------------------------------------------------------------------------*/
+class LockM : public MLock
+	{
+public:
+	LockM();
+	virtual TInt Flags();
+	virtual void Release();
+	virtual void Wait();
+	virtual void Signal();
+	virtual TInt Wait(TInt aTimeout);
+	virtual TInt Poll();
+public:
+	RMutex		iT;
+	};
+
+LockM::LockM()
+	{ test_KErrNone(iT.CreateLocal()); }
+TInt LockM::Flags()
+	{ return EPollable|ETimeoutAvail|ENestable|ELimit1; }
+void LockM::Release()
+	{ iT.Close(); }
+void LockM::Wait()
+	{ iT.Wait(); }
+void LockM::Signal()
+	{ iT.Signal(); }
+TInt LockM::Wait(TInt aTimeout)
+	{ return iT.Wait(aTimeout); }
+TInt LockM::Poll()
+	{ return iT.Poll(); }
+
+/*----------------------------------------------------------------------------*/
+
+class LockFL : public MLock
+	{
+public:
+	LockFL();
+	virtual TInt Flags();
+	virtual void Release();
+	virtual void Wait();
+	virtual void Signal();
+	virtual TInt Wait(TInt aTimeout);
+	virtual TInt Poll();
+public:
+	RFastLock	iT;
+	};
+
+LockFL::LockFL()
+	{ test_KErrNone(iT.CreateLocal()); }
+TInt LockFL::Flags()
+	{ return ETimeoutAvail|EPollable|ELimit1|ELooseTimeout; }
+void LockFL::Release()
+	{ iT.Close(); }
+void LockFL::Wait()
+	{ iT.Wait(); }
+void LockFL::Signal()
+	{ iT.Signal(); }
+TInt LockFL::Wait(TInt aTimeout)
+	{ return iT.Wait(aTimeout); }
+TInt LockFL::Poll()
+	{ return iT.Poll(); }
+
+/*----------------------------------------------------------------------------*/
+class LockCS : public MLock
+	{
+public:
+	LockCS();
+	virtual TInt Flags();
+	virtual void Release();
+	virtual void Wait();
+	virtual void Signal();
+public:
+	RCriticalSection iT;
+	};
+
+LockCS::LockCS()
+	{ test_KErrNone(iT.CreateLocal()); }
+TInt LockCS::Flags()
+	{ return ELimit1; }
+void LockCS::Release()
+	{ iT.Close(); }
+void LockCS::Wait()
+	{ iT.Wait(); }
+void LockCS::Signal()
+	{ iT.Signal(); }
+
+
 			 
+/*----------------------------------------------------------------------------*/
+class LFSR
+	{
+public:
+	LFSR(TInt aBits, TInt aTap2, TInt aTap3=0, TInt aTap4=0);
+	~LFSR();
+	void Step();
+	void Step(TInt aSteps);
+	TBool operator==(const LFSR& a) const;
+public:
+	TUint32* iData;
+	TInt iBits;
+	TInt iTap2;
+	TInt iTap3;
+	TInt iTap4;
+	TInt iNW;
+	TInt iSh1;
+	TInt iIx2;
+	TInt iSh2;
+	TInt iIx3;
+	TInt iSh3;
+	TInt iIx4;
+	TInt iSh4;
+	};
+
+LFSR::LFSR(TInt aBits, TInt aTap2, TInt aTap3, TInt aTap4)
+	{
+	iBits = aBits;
+	iTap2 = aTap2;
+	iTap3 = aTap3;
+	iTap4 = aTap4;
+	iNW = (aBits + 31) >> 5;
+	iData = (TUint32*)User::AllocZ(iNW*sizeof(TUint32));
+	test(iData!=0);
+	iData[0] = 1;
+	iSh1 = (aBits-1)&31;
+	iIx2 = (iTap2-1)>>5;
+	iSh2 = (iTap2-1)&31;
+	if (iTap3)
+		{
+		iIx3 = (iTap3-1)>>5;
+		iSh3 = (iTap3-1)&31;
+		}
+	else
+		{
+		iIx3 = -1;
+		iSh3 = 0;
+		}
+	if (iTap4)
+		{
+		iIx4 = (iTap4-1)>>5;
+		iSh4 = (iTap4-1)&31;
+		}
+	else
+		{
+		iIx4 = -1;
+		iSh4 = 0;
+		}
+	}
+
+LFSR::~LFSR()
+	{
+	User::Free(iData);
+	}
+
+void LFSR::Step(TInt aSteps)
+	{
+	while (aSteps--)
+		Step();
+	}
+
+void LFSR::Step()
+	{
+	TUint32 b = iData[iNW-1]>>iSh1;
+	b ^= (iData[iIx2]>>iSh2);
+	if (iIx3>=0)
+		b ^= (iData[iIx3]>>iSh3);
+	if (iIx4>=0)
+		b ^= (iData[iIx4]>>iSh4);
+	b &= 1;
+	TInt i;
+	for (i=0; i<iNW; ++i)
+		{
+		TUint32 bb = iData[i] >> 31;
+		iData[i] = (iData[i]<<1)|b;
+		b = bb;
+		}
+	iData[iNW-1] &= ((2u<<iSh1)-1u);
+	}
+
+TBool LFSR::operator==(const LFSR& a) const
+	{
+	if (iBits!=a.iBits || iTap2!=a.iTap2 || iTap3!=a.iTap3 || iTap4!=a.iTap4 || iNW!=a.iNW)
+		return EFalse;
+	if (iData==a.iData)
+		return ETrue;
+	if (memcompare((const TUint8*)iData, iNW, (const TUint8*)a.iData, a.iNW))
+		return EFalse;
+	return ETrue;
+	}
+
+
+
+/*----------------------------------------------------------------------------*/
 class CStack
 	{
 public:	   
@@ -118,6 +459,7 @@
 // Mutex test thread 1
 //
 	{	
+	TInt n = NumCpus();
 
 	thread1Count=0;
 	TBool running=ETrue;
@@ -133,6 +475,16 @@
 		else
 			running=EFalse;
 		mutex.Signal();
+
+		if (n > 1) 
+			{
+			// when the mutex is singaled, due to priority balancing, the other
+			// thread will be scheduled to run on a CPU other than this one. The delay
+			// in getting that thread to run means that this one can manage to re-claim the 
+			// mutex before the other thread gets to run. So we add a small delay here 
+			User::After(100); 
+			}
+
 		} while (running);
 	return(KErrNone);
 	}
@@ -142,6 +494,7 @@
 // Mutex test thread 2
 //
 	{
+	TInt n = NumCpus();
 
 	thread2Count=0;
 	TBool running=ETrue;
@@ -157,6 +510,17 @@
 		else
 			running=EFalse;
 		mutex.Signal();
+
+		if (n > 1) 
+			{
+			// when the mutex is singaled, due to priority balancing, the other
+			// thread will be scheduled to run on a CPU other than this one. The delay
+			// in getting that thread to run means that this one can manage to re-claim the 
+			// mutex before the other thread gets to run. So we add a small delay here 
+			User::After(100); 
+			}
+		
+
 		} while (running);
 	return(KErrNone);
 	}
@@ -209,27 +573,80 @@
 	return(KErrNone);
 	}
 
-struct SWaitSem
+
+/*----------------------------------------------------------------------------*/
+struct SWaitLock
 	{
-	RSemaphore iSem;
+	enum {EDummy=-2, EPoll=-1, EInfinite=0};
+
+	static TInt WaitLockThread(TAny*);
+	void Start(RThread& aT, TThreadPriority aP=EPriorityLess);
+	void Wait(RThread& aT, TInt aResult);
+	TInt DoTest2(RThread& aT, TInt aTimeout, TInt aResult, TThreadPriority aP=EPriorityLess);
+	void Test2();
+	void TestSignalled();
+	void TestNotSignalled();
+	void TestState();
+
+
+	MLock* iLock;
 	TInt iTimeout;
 	};
 
-TInt WaitSemThread(TAny* a)
+TInt SWaitLock::WaitLockThread(TAny* a)
 	{
-	SWaitSem& ws = *(SWaitSem*)a;
-	return ws.iSem.Wait(ws.iTimeout);
+	
+	if (doCpuLocking)
+		{
+		TInt r = LockCurrentThreadToCpu0();
+		if (KErrNone!=r) return r;
+		// Rendevous was requested
+		RThread::Rendezvous(KErrNone);
+		}
+	
+	SWaitLock& w = *(SWaitLock*)a;
+	TInt lfl = w.iLock->Flags();
+	TBool limit1 = lfl & MLock::ELimit1;
+	TInt r;
+	switch (w.iTimeout)
+		{
+		case EDummy:
+			return KErrNone;
+		case EPoll:
+			r = w.iLock->Poll();
+			break;
+		case EInfinite:
+			w.iLock->Wait();
+			r = KErrNone;
+			break;
+		default:
+			r = w.iLock->Wait(w.iTimeout);
+			break;
+		}
+	if (limit1 && r==KErrNone)
+		w.iLock->Signal();
+	return r;
 	}
 
-void StartWaitSemThread(RThread& aT, SWaitSem& aW, TThreadPriority aP=EPriorityLess)
+void SWaitLock::Start(RThread& aT, TThreadPriority aP)
 	{
-	TInt r = aT.Create(KNullDesC, &WaitSemThread, 0x1000, 0x1000, 0x1000, &aW);
+	TRequestStatus st;
+	TInt r = aT.Create(KNullDesC, &WaitLockThread, 0x1000, 0x1000, 0x1000, this);
 	test_KErrNone(r);
 	aT.SetPriority(aP);
+	if (doCpuLocking) 
+		{
+		aT.Rendezvous(st);
+		}
 	aT.Resume();
+	if (doCpuLocking) 
+		{
+		User::WaitForRequest(st);
+		test_KErrNone(st.Int());
+		}
 	}
 
-void WaitForWaitSemThread(RThread& aT, TInt aResult)
+void SWaitLock::Wait(RThread& aT, TInt aResult)
 	{
 	TRequestStatus s;
 	aT.Logon(s);
@@ -240,32 +657,67 @@
 	CLOSE_AND_WAIT(aT);
 	}
 
-TInt DummyThread(TAny*)
+TInt SWaitLock::DoTest2(RThread& aT, TInt aTimeout, TInt aResult, TThreadPriority aP)
 	{
-	return 0;
+	TTime initial;
+	TTime final;
+	iTimeout = aTimeout;
+	initial.HomeTime();
+	Start(aT, aP);
+	Wait(aT, aResult);
+	final.HomeTime();
+	TInt elapsed = I64INT(final.Int64()-initial.Int64());
+	return elapsed;
+	}
+
+void SWaitLock::TestSignalled()
+	{
+	TInt r = iLock->Poll();
+	if (r == KErrNotSupported)
+		r = iLock->Wait(1);
+	test_KErrNone(r);
 	}
 
-void TestSemaphore2()
+void SWaitLock::TestNotSignalled()
+	{
+	TInt r = iLock->Poll();
+	if (r == KErrNotSupported)
+		r = iLock->Wait(1);
+	test_Equal(KErrTimedOut, r);
+	}
+
+void SWaitLock::TestState()
 	{
-	test.Start(_L("Test semaphore wait with timeout"));
-	SWaitSem ws;
+	if (iLock->Flags() & MLock::ELimit1)
+		TestSignalled();	// not signalled afterwards
+	else
+		TestNotSignalled();
+	}
+
+void SWaitLock::Test2()
+	{
+	test.Start(_L("SWaitLock::Test2"));
 	RThread t;
+	RThread t2;
 	TTime initial;
 	TTime final;
-	TInt elapsed=0;
-	TInt r = ws.iSem.CreateLocal(0);
-	test_KErrNone(r);
+	TInt elapsed = 0;
+	TInt r = 0;
+	TInt lfl = iLock->Flags();
+	TBool nestable = lfl & MLock::ENestable;
+	TBool limit1 = lfl & MLock::ELimit1;
+	TBool pollable = lfl & MLock::EPollable;
+	TBool to = lfl & MLock::ETimeoutAvail;
+	TBool lto = lfl & MLock::ELooseTimeout;
 
 	RThread().SetPriority(EPriorityAbsoluteVeryLow);
 	TInt threadcount=0;
+	iTimeout = EDummy;
 	initial.HomeTime();
 	while (elapsed<1000000)
 		{
-		r = t.Create(KNullDesC, &DummyThread, 0x1000, NULL, NULL);
-		test_KErrNone(r);
-		t.SetPriority(EPriorityMore);
-		t.Resume();
-		t.Close();
+		Start(t, EPriorityMore);
+		Wait(t, KErrNone);
 		++threadcount;
 		final.HomeTime();
 		elapsed = I64INT(final.Int64()-initial.Int64());
@@ -275,125 +727,735 @@
 	TInt overhead = 1000000/threadcount;
 	test.Printf(_L("overhead = %dus\n"),overhead);
 
-	ws.iTimeout=1000000;
-	initial.HomeTime();
-	StartWaitSemThread(t, ws);
-	WaitForWaitSemThread(t, KErrTimedOut);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	test(elapsed>=900000+overhead && elapsed<1500000+overhead);
+	iLock->Wait();
 
-	ws.iTimeout=-1;
-	initial.HomeTime();
-	StartWaitSemThread(t, ws);
-	WaitForWaitSemThread(t, KErrArgument);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
+	if (to)
+		{
+		elapsed = DoTest2(t, 1000000, KErrTimedOut);
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed>=900000+overhead && elapsed<1500000+overhead);
+		elapsed = DoTest2(t, -99, KErrArgument);
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		}
 
-	ws.iTimeout=2000000;
-	initial.HomeTime();
-	StartWaitSemThread(t, ws);
-	User::After(1000000);
-	ws.iSem.Signal();
-	WaitForWaitSemThread(t, KErrNone);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	test(elapsed>=900000+overhead && elapsed<1500000+overhead);
+	if (pollable)
+		{
+		test.Printf(_L("Testing Poll() function\n"));
+		r = iLock->Poll();
+		test_Equal((nestable ? KErrNone : KErrTimedOut), r);
+		if (nestable)
+			{
+			iTimeout=EPoll;
+			r = iLock->Poll();
+			test_KErrNone(r);
+			iLock->Signal();
+			Start(t, EPriorityMore);
+			Wait(t, KErrTimedOut);
+			}
+		iLock->Signal();
+		if (nestable)
+			{
+			iTimeout=EPoll;
+			r = iLock->Poll();
+			test_KErrNone(r);
+			iLock->Signal();
+			Start(t, EPriorityMore);
+			Wait(t, KErrTimedOut);
+			iLock->Signal();
+			Start(t, EPriorityMore);
+			Wait(t, KErrNone);
+			}
+		r = iLock->Poll();
+		test_KErrNone(r);
+		if (!nestable)
+			{
+			r = iLock->Poll();
+			test_Equal(KErrTimedOut, r);
+			iLock->Signal();
+			if (!limit1)
+				{
+				iLock->Signal();
+				r = iLock->Poll();
+				test_KErrNone(r);
+				}
+			r = iLock->Poll();
+			test_KErrNone(r);
+			r = iLock->Poll();
+			test_Equal(KErrTimedOut, r);
+			}
+		elapsed = DoTest2(t, EPoll, KErrTimedOut);
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed<=50000+3*overhead);
+		iLock->Signal();
+		elapsed = DoTest2(t, EPoll, KErrNone);
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed<=50000+3*overhead);
+		TestState();
+		iLock->Signal();
+		r = LockCurrentThreadToCpu0(ETrue);
+		test_KErrNone(r);
+		Start(t, EPriorityMuchMore);
+		Start(t2, EPriorityMore);
+		test_Equal(EExitKill, t2.ExitType());
+		test_Equal(EExitKill, t.ExitType());
+		Wait(t2, limit1 ? KErrNone : KErrTimedOut);
+		Wait(t, KErrNone);
+		r = UnlockCurrentThreadToCpu0(ETrue);
+		test_KErrNone(r);
+		TestState();
+		}
+	else
+		{
+		test.Printf(_L("Poll() function not supported\n"));
+		}
 
-	ws.iTimeout=100000;
-	StartWaitSemThread(t, ws, EPriorityMore);
-	t.Suspend();
-	ws.iSem.Signal();
-	User::After(200000);
-	t.Resume();
-	WaitForWaitSemThread(t, KErrTimedOut);
-	test_KErrNone(ws.iSem.Wait(1));
+	if (to)
+		{
+		iTimeout=2000000;
+		initial.HomeTime();
+		Start(t);
+		User::After(1000000);
+		iLock->Signal();
+		Wait(t, KErrNone);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed>=900000+overhead && elapsed<1500000+overhead);
+		TestState();
 
-	ws.iTimeout=100000;
-	StartWaitSemThread(t, ws, EPriorityMore);
-	t.Suspend();
-	ws.iSem.Signal();
-	User::After(50000);
-	t.Resume();
-	WaitForWaitSemThread(t, KErrNone);
-	test_Equal(KErrTimedOut, ws.iSem.Wait(1));
+		r = LockCurrentThreadToCpu0(ETrue);
+		test_KErrNone(r);
 
-	RThread t2;
-	ws.iTimeout=100000;
-	StartWaitSemThread(t, ws, EPriorityMuchMore);
-	StartWaitSemThread(t2, ws, EPriorityMore);
-	t.Suspend();
-	ws.iSem.Signal();
-	test_Equal(EExitKill, t2.ExitType());
-	test_Equal(EExitPending, t.ExitType());
-	t.Resume();
-	WaitForWaitSemThread(t, KErrTimedOut);
-	WaitForWaitSemThread(t2, KErrNone);
-	test_Equal(KErrTimedOut, ws.iSem.Wait(1));
+		if (!lto)
+			{
+			iTimeout=100000;
+			Start(t, EPriorityMore);
+			t.Suspend();
+			iLock->Signal();
+			User::After(200000);
+			t.Resume();
+			Wait(t, KErrTimedOut);
+			TestSignalled();
 
-	ws.iTimeout=1000000;
-	initial.HomeTime();
-	StartWaitSemThread(t2, ws, EPriorityMore);
-	StartWaitSemThread(t, ws, EPriorityMuchMore);
-	ws.iSem.Signal();
-	WaitForWaitSemThread(t, KErrNone);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	WaitForWaitSemThread(t2, KErrTimedOut);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	test(elapsed>=900000+2*overhead && elapsed<1500000+2*overhead);
+			iTimeout=100000;
+			Start(t, EPriorityMore);
+			t.Suspend();
+			iLock->Signal();
+			User::After(50000);
+			t.Resume();
+			Wait(t, KErrNone);
+			TestState();
+
+			iTimeout=100000;
+			Start(t, EPriorityMuchMore);
+			Start(t2, EPriorityMore);
+			t.Suspend();
+			iLock->Signal();
+			test_Equal(EExitKill, t2.ExitType());
+			test_Equal(EExitPending, t.ExitType());
+			t.Resume();
+			Wait(t, limit1 ? KErrNone : KErrTimedOut);
+			Wait(t2, KErrNone);
+			TestState();
+			}
 
-	ws.iTimeout=1000000;
-	initial.HomeTime();
-	StartWaitSemThread(t2, ws, EPriorityMore);
-	StartWaitSemThread(t, ws, EPriorityMuchMore);
-	WaitForWaitSemThread(t, KErrTimedOut);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	WaitForWaitSemThread(t2, KErrTimedOut);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	test(elapsed>=900000+2*overhead && elapsed<1500000+2*overhead);
+		iTimeout=1000000;
+		initial.HomeTime();
+		Start(t2, EPriorityMore);
+		Start(t, EPriorityMuchMore);
+		iLock->Signal();
+		Wait(t, KErrNone);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		Wait(t2, limit1 ? KErrNone : KErrTimedOut);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		if (!limit1)
+			{
+			test(elapsed>=900000+2*overhead && elapsed<1500000+2*overhead);
+			}
+		TestState();
+
+		iTimeout=1000000;
+		initial.HomeTime();
+		Start(t2, EPriorityMore);
+		Start(t, EPriorityMuchMore);
+		Wait(t, KErrTimedOut);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		Wait(t2, KErrTimedOut);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed>=900000+2*overhead && elapsed<1500000+2*overhead);
 
-	ws.iTimeout=1000000;
-	initial.HomeTime();
-	StartWaitSemThread(t2, ws, EPriorityMore);
-	StartWaitSemThread(t, ws, EPriorityMuchMore);
-	t.Kill(299792458);
-	WaitForWaitSemThread(t2, KErrTimedOut);
-	WaitForWaitSemThread(t, 299792458);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	test(elapsed>=900000+2*overhead && elapsed<1500000+2*overhead);
+		iTimeout=1000000;
+		initial.HomeTime();
+		Start(t2, EPriorityMore);
+		Start(t, EPriorityMuchMore);
+		t.Kill(299792458);
+		Wait(t2, KErrTimedOut);
+		Wait(t, 299792458);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed>=900000+2*overhead && elapsed<1500000+2*overhead);
 
-	ws.iTimeout=1000000;
-	initial.HomeTime();
-	StartWaitSemThread(t, ws, EPriorityMore);
-	StartWaitSemThread(t2, ws, EPriorityMuchMore);
-	test_Equal(EExitPending, t.ExitType());
-	test_Equal(EExitPending, t2.ExitType());
-	ws.iSem.Close();
-	test_Equal(EExitKill, t.ExitType());
-	test_Equal(EExitKill, t2.ExitType());
-	WaitForWaitSemThread(t2, KErrGeneral);
-	WaitForWaitSemThread(t, KErrGeneral);
-	final.HomeTime();
-	elapsed = I64INT(final.Int64()-initial.Int64());
-	test.Printf(_L("Time taken = %dus\n"), elapsed);
-	test(elapsed<=50000+3*overhead);
-
+		iTimeout=1000000;
+		initial.HomeTime();
+		Start(t, EPriorityMore);
+		Start(t2, EPriorityMuchMore);
+		test_Equal(EExitPending, t.ExitType());
+		test_Equal(EExitPending, t2.ExitType());
+		iLock->Release();
+		test_Equal(EExitKill, t.ExitType());
+		test_Equal(EExitKill, t2.ExitType());
+		Wait(t2, KErrGeneral);
+		Wait(t, KErrGeneral);
+		final.HomeTime();
+		elapsed = I64INT(final.Int64()-initial.Int64());
+		test.Printf(_L("Time taken = %dus\n"), elapsed);
+		test(elapsed<=50000+3*overhead);
+		r = UnlockCurrentThreadToCpu0(ETrue);
+		test_KErrNone(r);
+		}
+	else
+		{
+		test.Printf(_L("Timed waits not supported\n"));
+		iLock->Release();
+		}
 	test.End();
 	}
 
+volatile TBool NoRepeat = EFalse;
+void TestPollTimeout()
+	{
+	SWaitLock w;
+	do	{
+		test.Printf(_L("TestPollTimeout - RSemaphore\n"));
+		LockS ls;
+		w.iLock = &ls;
+		w.Test2();	// Release()s ls
+		} while(NoRepeat);
+	do	{
+		test.Printf(_L("TestPollTimeout - RMutex\n"));
+		LockM lm;
+		w.iLock = &lm;
+		w.Test2();	// Release()s lm
+		} while(NoRepeat);
+	do	{
+		test.Printf(_L("TestPollTimeout - RFastLock\n"));
+		LockFL fl;
+		w.iLock = &fl;
+		w.Test2();	// Release()s fl
+		} while(NoRepeat);
+	}
+
+
+/*----------------------------------------------------------------------------*/
+class CMXThreadGrp;
+
+struct SStats
+	{
+	SStats();
+	void Add(TInt aValue);
+	void Add(const SStats& aS);
+	TInt Count() const {return iN;}
+	TInt Min() const;
+	TInt Max() const;
+	TInt Mean() const;
+
+	TInt64	iSum;
+	TInt	iMin;
+	TInt	iMax;
+	TInt	iN;
+	TInt	iSp;
+	};
+
+SStats::SStats()
+	{
+	iSum = 0;
+	iMax = KMinTInt;
+	iMin = ~iMax;
+	iN = 0;
+	iSp = 0;
+	}
+
+void SStats::Add(TInt aValue)
+	{
+	TInt64 v = aValue;
+	iSum += v;
+	++iN;
+	if (aValue > iMax)
+		iMax = aValue;
+	if (aValue < iMin)
+		iMin = aValue;
+	}
+
+void SStats::Add(const SStats& a)
+	{
+	iN += a.iN;
+	iSum += a.iSum;
+	if (a.iMax > iMax)
+		iMax = a.iMax;
+	if (a.iMin < iMin)
+		iMin = a.iMin;
+	}
+
+TInt SStats::Min() const
+	{return iN ? iMin : 0;}
+
+TInt SStats::Max() const
+	{return iN ? iMax : 0;}
+
+TInt SStats::Mean() const
+	{
+	if (iN==0)
+		return 0;
+	return (TInt)(iSum/TInt64(iN));
+	}
+
+TUint32 ticks_to_us(TUint32 aTicks, TUint32 aF)
+	{
+	TUint64 x = aTicks;
+	TUint64 f = aF;
+	x *= TUint64(1000000);
+	x += (f>>1);
+	x /= f;
+	return I64LOW(x);
+	}
+
+class CMXThread : public CBase
+	{
+private:
+	CMXThread();
+	~CMXThread();
+	static CMXThread* New(CMXThreadGrp* aG, TUint32 aId, TUint32 aL, TUint32 aD);
+	void Start();
+	void Wait();
+	TInt Construct(CMXThreadGrp* aG, TUint32 aId, TUint32 aL, TUint32 aD);
+	TInt Steps();
+	TInt Action();
+	TInt Run();
+	static TInt ThreadFunc(TAny*);
+	void PrintStats();
+private:
+	TUint64 iSeed;
+	RThread	iThread;
+	TRequestStatus iExitStatus;
+	CMXThreadGrp* iG;
+	LFSR* iDummyLfsr;
+	TUint32 iId;
+	TUint32 iLambda;
+	TUint32 iDummySteps;
+	TInt iTotalSteps;
+	TInt iIterations;
+	TInt iPolls;
+	TInt iPollFails;
+	SStats iStats;
+	SStats iTimeoutStats;
+private:
+	friend class CMXThreadGrp;
+	};
+
+class CMXThreadGrp : public CBase
+	{
+public:
+	static CMXThreadGrp* New(MLock* aLock, TInt aNThreads, TUint32 aLambda, TUint32 aDummySteps, TUint32 aTime);
+	CMXThreadGrp();
+	~CMXThreadGrp();
+	TBool Run();
+	void PrintStats();
+private:
+	TInt Construct(MLock* aLock, TInt aNThreads, TUint32 aLambda, TUint32 aDummySteps, TUint32 aTime);
+private:
+	TInt iNThreads;
+	CMXThread** iThreads;
+	MLock* iLock;
+	LFSR* iLfsr;
+	LFSR* iLfsr0;
+	TUint32 iNTickPeriod;
+	TUint32 iFCF;
+	TUint32 iNTicks;
+	TInt iTotalSteps;
+	TInt iIterations;
+	TInt iPolls;
+	TInt iPollFails;
+	SStats iStats;
+	SStats iTimeoutStats;
+private:
+	friend class CMXThread;
+	};
+
+CMXThread::CMXThread()
+	{
+	iThread.SetHandle(0);
+	}
+
+CMXThread::~CMXThread()
+	{
+	delete iDummyLfsr;
+	if (iThread.Handle())
+		{
+		if (iThread.ExitType() == EExitPending)
+			{
+			iThread.Kill(0);
+			Wait();
+			}
+		CLOSE_AND_WAIT(iThread);
+		}
+	}
+
+void CMXThread::PrintStats()
+	{
+	test.Printf(_L("Thread %d:\n"), iId);
+	test.Printf(_L(" ST:%10d IT:%10d P:%10d PF:%10d TO:%10d\n"), iTotalSteps, iIterations, iPolls, iPollFails, iTimeoutStats.Count());
+	TUint32 min, max, mean;
+	min = ticks_to_us(iStats.Min(), iG->iFCF);
+	max = ticks_to_us(iStats.Max(), iG->iFCF);
+	mean = ticks_to_us(iStats.Mean(), iG->iFCF);
+	test.Printf(_L(" Lock acquire times MIN %10d MAX %10d AVG %10d\n"), min, max, mean);
+	min = ticks_to_us(iTimeoutStats.Min(), iG->iFCF);
+	max = ticks_to_us(iTimeoutStats.Max(), iG->iFCF);
+	mean = ticks_to_us(iTimeoutStats.Mean(), iG->iFCF);
+	test.Printf(_L(" Lock timeout times MIN %10d MAX %10d AVG %10d\n"), min, max, mean);
+	}
+
+TInt CMXThread::Construct(CMXThreadGrp* aG, TUint32 aId, TUint32 aL, TUint32 aD)
+	{
+	iG = aG;
+	iId = aId;
+	iLambda = aL;
+	iDummySteps = aD;
+	iSeed = iId + 1;
+	iDummyLfsr = new LFSR(785,693);
+	if (!iDummyLfsr)
+		return KErrNoMemory;
+	TBuf<16> name = _L("TSThrd");
+	name.AppendNum(iId);
+	TInt r = iThread.Create(name, &ThreadFunc, 0x1000, NULL, this);
+	if (r!=KErrNone)
+		return r;
+	iThread.Logon(iExitStatus);
+	if (iExitStatus != KRequestPending)
+		{
+		iThread.Kill(0);
+		iThread.Close();
+		iThread.SetHandle(0);
+		return iExitStatus.Int();
+		}
+	iThread.SetPriority(EPriorityLess);
+	return KErrNone;
+	}
+
+CMXThread* CMXThread::New(CMXThreadGrp* aG, TUint32 aId, TUint32 aL, TUint32 aD)
+	{
+	CMXThread* p = new CMXThread;
+	if (p)
+		{
+		TInt r = p->Construct(aG, aId, aL, aD);
+		if (r != KErrNone)
+			{
+			delete p;
+			p = 0;
+			}
+		}
+	return p;
+	}
+
+void CMXThread::Start()
+	{
+	iThread.Resume();
+	}
+
+void CMXThread::Wait()
+	{
+	User::WaitForRequest(iExitStatus);
+	}
+
+TInt CMXThread::ThreadFunc(TAny* aPtr)
+	{
+	CMXThread& a = *(CMXThread*)aPtr;
+	return a.Run();
+	}
+
+TInt CMXThread::Steps()
+	{
+	Random(iSeed);
+	return ExpRV(iSeed, iLambda, 1);
+	}
+
+TInt CMXThread::Action()
+	{
+	Random(iSeed);
+	return I64LOW(iSeed)%3;
+	}
+
+TInt CMXThread::Run()
+	{
+	MLock* lock = iG->iLock;
+	LFSR* lfsr = iG->iLfsr;
+	TInt lfl = lock->Flags();
+	TBool pollable = lfl & MLock::EPollable;
+	TBool to = lfl & MLock::ETimeoutAvail;
+	TUint32 start_time = User::NTickCount();
+	TInt r;
+
+	FOREVER
+		{
+		TUint32 now = User::NTickCount();
+		if (now - start_time >= iG->iNTicks)
+			break;
+		++iIterations;
+		iDummyLfsr->Step(iDummySteps);
+		TInt action = Action();
+		TInt steps = Steps();
+		TUint32 initial = User::FastCounter();
+		if (action==2 && to)
+			{
+			r = lock->Wait(1000);
+			if (r!=KErrNone)
+				{
+				TUint32 final = User::FastCounter();
+				TInt elapsed = TInt(final - initial);
+				iTimeoutStats.Add(elapsed);
+				}
+			}
+		else if (action==1 && pollable)
+			{
+			++iPolls;
+			r = lock->Poll();
+			if (r!=KErrNone)
+				++iPollFails;
+			}
+		else
+			{
+			lock->Wait();
+			r = KErrNone;
+			}
+		if (r == KErrNone)
+			{
+			TUint32 final = User::FastCounter();
+			lfsr->Step(steps);
+			lock->Signal();
+			TInt elapsed = TInt(final - initial);
+			iTotalSteps += steps;
+			iStats.Add(elapsed);
+			}
+		}
+
+	return KErrNone;
+	}
+
+CMXThreadGrp* CMXThreadGrp::New(MLock* aLock, TInt aNThreads, TUint32 aLambda, TUint32 aDummySteps, TUint32 aTime)
+	{
+	CMXThreadGrp* p = new CMXThreadGrp;
+	if (p)
+		{
+		TInt r = p->Construct(aLock, aNThreads, aLambda, aDummySteps, aTime);
+		if (r != KErrNone)
+			{
+			delete p;
+			p = 0;
+			}
+		}
+	return p;
+	}
+
+CMXThreadGrp::CMXThreadGrp()
+	{
+	}
+
+TInt CMXThreadGrp::Construct(MLock* aLock, TInt aNThreads, TUint32 aLambda, TUint32 aDummySteps, TUint32 aTime)
+	{
+	iNThreads = aNThreads;
+	iLock = aLock;
+	TInt r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)iFCF);
+	if (r!=KErrNone)
+		return r;
+	r = HAL::Get(HAL::ENanoTickPeriod, (TInt&)iNTickPeriod);
+	if (r!=KErrNone)
+		return r;
+	iNTicks = (aTime+iNTickPeriod-1)/iNTickPeriod;
+	iLfsr = new LFSR(785,693);
+	iLfsr0 = new LFSR(785,693);
+	if (!iLfsr || !iLfsr0)
+		return KErrNoMemory;
+	iThreads = (CMXThread**)User::AllocZ(iNThreads*sizeof(CMXThread*));
+	if (!iThreads)
+		return KErrNoMemory;
+	TInt i;
+	for (i=0; i<iNThreads; ++i)
+		{
+		iThreads[i] = CMXThread::New(this, i, aLambda, aDummySteps);
+		if (!iThreads[i])
+			return KErrNoMemory;
+		}
+	return KErrNone;
+	}
+
+CMXThreadGrp::~CMXThreadGrp()
+	{
+	delete iLfsr;
+	delete iLfsr0;
+	if (iThreads)
+		{
+		TInt i;
+		for (i=0; i<iNThreads; ++i)
+			delete iThreads[i];
+		}
+	User::Free(iThreads);
+	}
+
+TBool CMXThreadGrp::Run()
+	{
+	TInt i;
+	test.Printf(_L("Starting test with N=%d L=%d D=%d T=%d\n"), iNThreads, iThreads[0]->iLambda, iThreads[0]->iDummySteps, iNTicks);
+	for (i=0; i<iNThreads; ++i)
+		iThreads[i]->Start();
+	for (i=0; i<iNThreads; ++i)
+		iThreads[i]->Wait();
+	for (i=0; i<iNThreads; ++i)
+		{
+		iTotalSteps += iThreads[i]->iTotalSteps;
+		iIterations += iThreads[i]->iIterations;
+		iPolls += iThreads[i]->iPolls;
+		iPollFails += iThreads[i]->iPollFails;
+		iStats.Add(iThreads[i]->iStats);
+		iTimeoutStats.Add(iThreads[i]->iTimeoutStats);
+		}
+	test.Printf(_L("Total LFSR steps %d\n"), iTotalSteps);
+	iLfsr0->Step(iTotalSteps);
+	TBool ok = (*iLfsr == *iLfsr0);
+	return ok;
+	}
+
+void CMXThreadGrp::PrintStats()
+	{
+	TInt i;
+	for (i=0; i<iNThreads; ++i)
+		{
+		iThreads[i]->PrintStats();
+		}
+	test.Printf(_L("TOTALS:\n"));
+	test.Printf(_L(" ST:%10d IT:%10d P:%10d PF:%10d TO:%10d\n"), iTotalSteps, iIterations, iPolls, iPollFails, iTimeoutStats.Count());
+	TUint32 min, max, mean;
+	min = ticks_to_us(iStats.Min(), iFCF);
+	max = ticks_to_us(iStats.Max(), iFCF);
+	mean = ticks_to_us(iStats.Mean(), iFCF);
+	test.Printf(_L(" Lock acquire times MIN %10d MAX %10d AVG %10d\n"), min, max, mean);
+	min = ticks_to_us(iTimeoutStats.Min(), iFCF);
+	max = ticks_to_us(iTimeoutStats.Max(), iFCF);
+	mean = ticks_to_us(iTimeoutStats.Mean(), iFCF);
+	test.Printf(_L(" Lock timeout times MIN %10d MAX %10d AVG %10d\n"), min, max, mean);
+	}
+
+TUint32 Calibrate()
+	{
+	TUint32 fcf;
+	TInt r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)fcf);
+	test_KErrNone(r);
+	LFSR* d = new LFSR(785,693);
+	test(d!=0);
+	TInt steps = 2;
+	TUint32 ticks = fcf/10;
+	TUint32 elapsed;
+	FOREVER
+		{
+		TUint32 h0 = User::FastCounter();
+		d->Step(steps);
+		TUint32 h1 = User::FastCounter();
+		elapsed = h1 - h0;
+		if (elapsed > ticks)
+			break;
+		steps *= 2;
+		}
+	delete d;
+	test.Printf(_L("%d steps in %d fast ticks\n"), steps, elapsed);
+	TUint64 x = elapsed;
+	TUint64 s = steps;
+	TUint64 y = fcf;
+	y /= x;
+	s *= y;	// steps per second
+	TUint32 res = I64LOW(s);
+	test.Printf(_L("%d steps per second\n"), res);
+	return res;
+	}
+
+void DoTMX(MLock* aLock, TInt aNThreads, TUint32 aLambda, TUint32 aDummySteps, TUint32 aTime, TBool aShouldFail=EFalse)
+	{
+	CMXThreadGrp* g = CMXThreadGrp::New(aLock, aNThreads, aLambda, aDummySteps, aTime);
+	test(g!=0);
+	TBool ok = g->Run();
+	if (aShouldFail)
+		{
+		test(!ok);
+		}
+	else
+		{
+		test(ok);
+		}
+	g->PrintStats();
+	delete g;
+	}
+
+void DoTMX(MLock* aLock, TUint32 aLambda, TUint32 aDummySteps, TUint32 aTime)
+	{
+	TInt n;
+	for (n=1; n<=4; ++n)
+		{
+		TUint32 l = (n<2) ? aLambda : (aLambda/(n-1));
+		DoTMX(aLock, n, l, aDummySteps, aTime);
+		}
+	aLock->Release();
+	}
+
+
+void TestMutualExclusion()
+	{
+	TInt ntp;
+	TInt r = HAL::Get(HAL::ENanoTickPeriod, ntp);
+	test_KErrNone(r);
+	test.Printf(_L("Nanokernel tick period = %dus\n"), ntp);
+	TUint32 sps = Calibrate();
+	TUint32 lambda = sps/2000;
+	TUint32 dummy = sps/2000;
+	TUint32 time = 5000000;
+	do	{
+		test.Printf(_L("TestMutualExclusion - RSemaphore\n"));
+		LockS ls;
+		DoTMX(&ls, lambda, dummy, time);
+		} while(NoRepeat);
+	do	{
+		test.Printf(_L("TestMutualExclusion - RSemaphore init=2\n"));
+		LockS ls2;
+		ls2.Signal();	// count=2
+		DoTMX(&ls2, 4, lambda, dummy, time, ETrue);
+		} while(NoRepeat);
+	do	{
+		test.Printf(_L("TestMutualExclusion - RMutex\n"));
+		LockM lm;
+		DoTMX(&lm, lambda, dummy, time);
+		} while(NoRepeat);
+	do	{
+		test.Printf(_L("TestMutualExclusion - RFastLock\n"));
+		LockFL fl;
+		DoTMX(&fl, lambda, dummy, time);
+		} while(NoRepeat);
+	do	{
+		test.Printf(_L("TestMutualExclusion - RCriticalSection\n"));
+		LockCS cs;
+		DoTMX(&cs, lambda, dummy, time);
+		} while(NoRepeat);
+	}
+
+
+
+
+/*----------------------------------------------------------------------------*/
 void TestSemaphore()
 	{
 /*********** TO DO ************/
@@ -417,23 +1479,23 @@
 	test.Next(_L("Producer/Consumer scenario"));
 	// Test Rsemaphore with the producer/consumer scenario	RThread thread1, thread2;
 	TRequestStatus stat1, stat2;
-	test_KErrNone(mutex.CreateLocal());
-	test_KErrNone(slotAvailable.CreateLocal(KMaxBufferSize));
-	test_KErrNone(itemAvailable.CreateLocal(0));
-	test_KErrNone(thread1.Create(_L("Thread1"),Producer,KDefaultStackSize,0x200,0x200,NULL));
-	test_KErrNone(thread2.Create(_L("Thread2"),Consumer,KDefaultStackSize,0x200,0x200,NULL));
+	test(mutex.CreateLocal()==KErrNone);
+	test(slotAvailable.CreateLocal(KMaxBufferSize)==KErrNone);
+	test(itemAvailable.CreateLocal(0)==KErrNone);
+	test(thread1.Create(_L("Thread1"),Producer,KDefaultStackSize,0x200,0x200,NULL)==KErrNone);
+	test(thread2.Create(_L("Thread2"),Consumer,KDefaultStackSize,0x200,0x200,NULL)==KErrNone);
 	thread1.Logon(stat1);
 	thread2.Logon(stat2);
-	test_Equal(KRequestPending, stat1.Int());
-	test_Equal(KRequestPending, stat2.Int());
+	test(stat1==KRequestPending);
+	test(stat2==KRequestPending);
 	thread1.Resume(); 
 	thread2.Resume();
 	User::WaitForRequest(stat1);
 	User::WaitForRequest(stat2);
-	test_KErrNone(stat1.Int());
-	test_KErrNone(stat2.Int());
+	test(stat1==KErrNone);
+	test(stat2==KErrNone);
 	for(TInt jj=0;jj<KNumProducerItems;jj++)
-		test_Equal(jj, consumerArray[jj]);		
+		test(consumerArray[jj]==jj);		
 	
 	test.Next(_L("Close"));
 	mutex.Close();
@@ -446,7 +1508,7 @@
 	{
 	RMutex m;
 	test.Start(_L("Create"));
-	test_KErrNone(m.CreateLocal());
+	test(m.CreateLocal()==KErrNone);
 
 	// Test RMutex::IsHeld()
 	test.Next(_L("IsHeld ?"));
@@ -466,7 +1528,7 @@
 void TestMutex()
 	{
 	test.Start(_L("Create"));
-	test_KErrNone(mutex.CreateLocal());
+	test(mutex.CreateLocal()==KErrNone);
 	
 	test.Next(_L("Threads writing to arrays test"));
 //
@@ -480,19 +1542,19 @@
 //
 	arrayIndex=0;
 	RThread thread1,thread2;	
-	test_KErrNone(thread1.Create(_L("Thread1"),MutexThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL));
-	test_KErrNone(thread2.Create(_L("Thread2"),MutexThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL));			 
+	test(thread1.Create(_L("Thread1"),MutexThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);
+	test(thread2.Create(_L("Thread2"),MutexThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);			 
 	TRequestStatus stat1,stat2;
 	thread1.Logon(stat1);
 	thread2.Logon(stat2);
-	test_Equal(KRequestPending, stat1.Int());
-	test_Equal(KRequestPending, stat2.Int());
+	test(stat1==KRequestPending);
+	test(stat2==KRequestPending);
 	thread1.Resume(); 
 	thread2.Resume();
 	User::WaitForRequest(stat1);
 	User::WaitForRequest(stat2);
-	test_KErrNone(stat1.Int());
-	test_KErrNone(stat2.Int()); 
+	test(stat1==KErrNone);
+	test(stat2==KErrNone); 
 	TInt thread1ActualCount=0; 
 	TInt thread2ActualCount=0;
 	TInt ii=0;
@@ -504,11 +1566,11 @@
 			thread2ActualCount++;
 		ii++;
 		}
-	test.Printf(_L("T1 %d T1ACT %d T2 %d T2ACT %d"),thread1Count,thread1ActualCount,thread2Count,thread2ActualCount);
-	test_Equal(thread1Count, thread1ActualCount);
-	test_Equal(thread2Count, thread2ActualCount);
-	test_Equal(thread2Count, thread1Count);
-	test_Equal((KMaxArraySize>>1), thread1Count);
+	test.Printf(_L("T1 %d T1ACT %d T2 %d T2ACT %d\n"),thread1Count,thread1ActualCount,thread2Count,thread2ActualCount);
+	test(thread1ActualCount==thread1Count);
+	test(thread2ActualCount==thread2Count);
+	test(thread1Count==thread2Count);
+	test(thread1Count==(KMaxArraySize>>1));
 	
 	test.Next(_L("Close"));
 	CLOSE_AND_WAIT(thread1);
@@ -524,7 +1586,7 @@
 	{
 	
 	test.Start(_L("Create"));
-	test_KErrNone(criticalSn.CreateLocal());
+	test(criticalSn.CreateLocal()==KErrNone);
 
 /***************** TO DO ***********************
 
@@ -553,20 +1615,21 @@
 // threads think.
 //
 	arrayIndex=0;
+
 	RThread thread1,thread2;	
-	test_KErrNone(thread1.Create(_L("Thread1"),CriticalSnThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL));
-	test_KErrNone(thread2.Create(_L("Thread2"),CriticalSnThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL));			 
+	test(thread1.Create(_L("Thread1"),CriticalSnThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);
+	test(thread2.Create(_L("Thread2"),CriticalSnThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);			 
 	TRequestStatus stat1,stat2;
 	thread1.Logon(stat1);
 	thread2.Logon(stat2);
-	test_Equal(KRequestPending, stat1.Int());
-	test_Equal(KRequestPending, stat2.Int());
+	test(stat1==KRequestPending);
+	test(stat2==KRequestPending);
 	thread1.Resume(); 
 	thread2.Resume();
 	User::WaitForRequest(stat1);
 	User::WaitForRequest(stat2);
-	test_KErrNone(stat1.Int());
-	test_KErrNone(stat2.Int()); 
+	test(stat1==KErrNone);
+	test(stat2==KErrNone); 
 	TInt thread1ActualCount=0; 
 	TInt thread2ActualCount=0;
 	TInt ii=0;
@@ -578,10 +1641,10 @@
 			thread2ActualCount++;
 		ii++;
 		}
-	test_Equal(thread1Count, thread1ActualCount);
-	test_Equal(thread2Count, thread2ActualCount);
-	test_Equal(thread2Count, thread1Count);
-	test_Equal((KMaxArraySize>>1), thread1Count);
+	test(thread1ActualCount==thread1Count);
+	test(thread2ActualCount==thread2Count);
+	test(thread1Count==thread2Count);
+	test(thread1Count==(KMaxArraySize>>1));
 
 	test.Next(_L("Close"));
 	CLOSE_AND_WAIT(thread1);
@@ -593,22 +1656,13 @@
 
 GLDEF_C TInt E32Main()
 	{	
-	TInt cpus = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
-	if (cpus != 1)
-		{
-		test(cpus>1);
-		// This test will require compatibility mode (and probably other changes)
-		// to work on SMP - it depends on explicit scheduling order.
-		test.Printf(_L("T_SEMUTX skipped, does not work on SMP\n"));
-		return KErrNone;
-		}	
-	
 
 	test.Title();
  	__UHEAP_MARK;
+	TestMutualExclusion();
+	TestPollTimeout();
 	test.Start(_L("Test RSemaphore"));
 	TestSemaphore();
-	TestSemaphore2();
 	test.Next(_L("Test RMutex"));
 	TestMutex();
 	TestMutex2();
--- a/kerneltest/e32utils/analyse/profiler.rtf	Wed Jun 23 19:44:53 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3017 +0,0 @@
-{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2057{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
-{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}
-{\f35\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f36\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}{\f37\froman\fcharset238\fprq2 Times New Roman CE;}{\f38\froman\fcharset204\fprq2 Times New Roman Cyr;}
-{\f40\froman\fcharset161\fprq2 Times New Roman Greek;}{\f41\froman\fcharset162\fprq2 Times New Roman Tur;}{\f42\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f43\froman\fcharset178\fprq2 Times New Roman (Arabic);}
-{\f44\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f45\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f47\fswiss\fcharset238\fprq2 Arial CE;}{\f48\fswiss\fcharset204\fprq2 Arial Cyr;}{\f50\fswiss\fcharset161\fprq2 Arial Greek;}
-{\f51\fswiss\fcharset162\fprq2 Arial Tur;}{\f52\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f53\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f54\fswiss\fcharset186\fprq2 Arial Baltic;}{\f55\fswiss\fcharset163\fprq2 Arial (Vietnamese);}
-{\f57\fmodern\fcharset238\fprq1 Courier New CE;}{\f58\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f60\fmodern\fcharset161\fprq1 Courier New Greek;}{\f61\fmodern\fcharset162\fprq1 Courier New Tur;}{\f62\fmodern\fcharset177\fprq1 Courier New (Hebrew);}
-{\f63\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f64\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f65\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f387\fswiss\fcharset238\fprq2 Tahoma CE;}{\f388\fswiss\fcharset204\fprq2 Tahoma Cyr;}
-{\f390\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f391\fswiss\fcharset162\fprq2 Tahoma Tur;}{\f392\fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f393\fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f394\fswiss\fcharset186\fprq2 Tahoma Baltic;}
-{\f395\fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f396\fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f397\fmodern\fcharset238\fprq1 Lucida Console CE;}{\f398\fmodern\fcharset204\fprq1 Lucida Console Cyr;}
-{\f400\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f401\fmodern\fcharset162\fprq1 Lucida Console Tur;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;
-\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red255\green255\blue255;
-}{\stylesheet{\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \snext0 Normal;}{\s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 
-\b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 
-\b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 2;}{\s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
-\sbasedon0 \snext0 heading 3;}{\s4\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel3\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 4;}{
-\s9\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\faauto\outlinelevel8\rin0\lin0\itap0 \b\i\f1\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
-\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
-\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\sb60\sa60\widctlpar\brdrb\brdrs\brdrw15\brsp20 
-\tqc\tx4153\tqr\tx9639\wrapdefault\faauto\rin0\lin0\itap0 \f1\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext15 header;}{\s16\ql \li0\ri0\sb60\sa60\widctlpar\brdrt\brdrs\brdrw15\brsp20 
-\tqc\tx4153\tqr\tx9639\wrapdefault\faauto\rin0\lin0\rtlgutter\itap0 \f1\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext16 footer;}{\s17\ql \li0\ri0\sb60\sa120\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 
-\fs22\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext17 DocumentSubTitle;}{\s18\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \b\fs21\cf8\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
-\sbasedon0 \snext18 Tabletitle;}{\*\cs19 \additive \f1 \sbasedon10 Filename;}{\*\cs20 \additive \b\f36 \sbasedon10 Syntax Literal;}{\*\cs21 \additive \i \sbasedon10 Syntax Element;}{\s22\ql \li851\ri851\sb60\sa240\keep\widctlpar\brdrt
-\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\faauto\rin851\lin851\rtlgutter\itap0 \fs24\lang1033\langfe2057\cgrid\langnp1033\langfenp2057 \sbasedon0 \snext0 Syntax;}{
-\s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext23 Comamnd;}{\s24\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 
-\f35\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext24 \ssemihidden \styrsid6372845 Balloon Text;}{\*\ts25\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 
-\trbrdrv\brdrs\brdrw10 \trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype0\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
-\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \sbasedon11 \snext25 \styrsid678217 Table Grid;}{
-\s26\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f2\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext26 \styrsid8592727 Body Text;}{\*\cs27 \additive \sbasedon10 \styrsid11890070 f40;}}
-{\*\listtable{\list\listtemplateid-1714398180\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01*;}{\levelnumbers;}\hres0\chhres0 }{\listname ;}\listid-2}
-{\list\listtemplateid1604386730\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720
-\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440
-\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160
-\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880
-\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600
-\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320
-\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040
-\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760
-\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480
-\jclisttab\tx6480\lin6480 }{\listname ;}\listid227346643}{\list\listtemplateid597999524\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689
-\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691
-\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693
-\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689
-\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691
-\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693
-\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698689
-\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698691
-\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698693
-\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid607854900}{\list\listtemplateid-2132086688\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0
-\levelspace45\levelindent0{\leveltext\leveltemplateid-1068182316\'01-;}{\levelnumbers;}\loch\af0\hich\af0\dbch\af0\fbias0\hres0\chhres0 \fi-360\li450\jclisttab\tx450\lin450 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
-\levelspace45\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1485\jclisttab\tx1485\lin1485 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45
-\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2205\jclisttab\tx2205\lin2205 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0
-{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2925\jclisttab\tx2925\lin2925 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3645\jclisttab\tx3645\lin3645 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4365\jclisttab\tx4365\lin4365 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5085\jclisttab\tx5085\lin5085 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5805\jclisttab\tx5805\lin5805 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6525\jclisttab\tx6525\lin6525 }{\listname ;}\listid1202405001}{\list\listtemplateid1624279010\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
-\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1068182316\'01-;}{\levelnumbers;}\loch\af0\hich\af0\dbch\af0\fbias0\hres0\chhres0 \fi-360\li405\jclisttab\tx405\lin405 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
-\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1125\jclisttab\tx1125\lin1125 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
-\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li1845\jclisttab\tx1845\lin1845 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
-\levelspace0\levelindent0{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2565\jclisttab\tx2565\lin2565 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
-\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3285\jclisttab\tx3285\lin3285 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
-\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4005\jclisttab\tx4005\lin4005 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
-\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li4725\jclisttab\tx4725\lin4725 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
-\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5445\jclisttab\tx5445\lin5445 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807557
-\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6165\jclisttab\tx6165\lin6165 }{\listname ;}\listid1562641293}{\list\listtemplateid1239692824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0
-\levelspace45\levelindent0{\leveltext\leveltemplateid-1068182316\'01-;}{\levelnumbers;}\loch\af0\hich\af0\dbch\af0\fbias0\hres0\chhres0 \fi-360\li405\jclisttab\tx405\lin405 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
-\levelspace45\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45
-\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0
-{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace45\levelindent0{\leveltext
-\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1755588230}}{\*\listoverridetable{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat
-{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-283\li283\lin283 }}\ls1}{\listoverride\listid607854900
-\listoverridecount0\ls2}{\listoverride\listid227346643\listoverridecount0\ls3}{\listoverride\listid1562641293\listoverridecount0\ls4}{\listoverride\listid1202405001\listoverridecount0\ls5}{\listoverride\listid1755588230\listoverridecount0\ls6}}
-{\*\rsidtbl \rsid212434\rsid335316\rsid481371\rsid678217\rsid735290\rsid1653898\rsid2495527\rsid3154883\rsid3544718\rsid3948828\rsid4207626\rsid4285936\rsid4540351\rsid5055728\rsid5070621\rsid5196648\rsid5403878\rsid5454414\rsid6226036\rsid6254420
-\rsid6307333\rsid6310753\rsid6358148\rsid6372845\rsid6816192\rsid6890489\rsid7406415\rsid7810845\rsid8289572\rsid8334973\rsid8592727\rsid9066106\rsid9120167\rsid10028869\rsid10304687\rsid10551457\rsid10961137\rsid11476477\rsid11748829\rsid11890070
-\rsid12218284\rsid12285517\rsid12334294\rsid12336355\rsid12536172\rsid13524902\rsid14296482\rsid15020123\rsid15342006\rsid15867397\rsid16414626\rsid16604991}{\*\generator Microsoft Word 10.0.6818;}{\info{\title Standard:_}{\author Andrew Thoelke}
-{\operator lukaszforynski}{\creatim\yr2000\mo9\dy26\hr14\min25}{\revtim\yr2007\mo7\dy9\hr14\min59}{\printim\yr2000\mo9\dy27\hr13\min29}{\version26}{\edmins1541}{\nofpages14}{\nofwords3744}{\nofchars21344}{\*\company Symbian}{\nofcharsws25038}
-{\vern16393}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 urn:schemas-microsoft-com:office:smarttags}}\paperw11907\paperh16840\margl1134\margr1134\margt1134\margb1134\gutter0 
-\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot6254420 \fet0
-{\*\wgrffmtfilter 013f}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\headerr \pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\pvpara\phmrg\posxr\posy0\dxfrtext181\dfrmtxtx181\dfrmtxty0\nowrap\faauto\rin0\lin0\itap0 
-\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid4207626 {\*\shppict{\pict{\*\picprop\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}
-{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex17\picscaley17\piccropl0\piccropr0\piccropt0\piccropb0\picw23813\pich6615\picwgoal13500\pichgoal3750\pngblip\bliptag1016976793{\*\blipuid 3c9dd5997eca05e5285611ada434fb29}
-89504e470d0a1a0a0000000d4948445200000384000000fa0803000000ce507925000000017352474200aece1ce900000300504c5445ffffffffffccffff99ff
-ff66ffff33ffff00ffccffffccccffcc99ffcc66ffcc33ffcc00ff99ffff99ccff9999ff9966ff9933ff9900ff66ffff66ccff6699ff6666ff6633ff6600ff33
-ffff33ccff3399ff3366ff3333ff3300ff00ffff00ccff0099ff0066ff0033ff0000ccffffccffccccff99ccff66ccff33ccff00ccccffcccccccccc99cccc66
-cccc33cccc00cc99ffcc99cccc9999cc9966cc9933cc9900cc66ffcc66cccc6699cc6666cc6633cc6600cc33ffcc33cccc3399cc3366cc3333cc3300cc00ffcc
-00cccc0099cc0066cc0033cc000099ffff99ffcc99ff9999ff6699ff3399ff0099ccff99cccc99cc9999cc6699cc3399cc009999ff9999cc9999999999669999
-339999009966ff9966cc9966999966669966339966009933ff9933cc9933999933669933339933009900ff9900cc99009999006699003399000066ffff66ffcc
-66ff9966ff6666ff3366ff0066ccff66cccc66cc9966cc6666cc3366cc006699ff6699cc6699996699666699336699006666ff6666cc66669966666666663366
-66006633ff6633cc6633996633666633336633006600ff6600cc66009966006666003366000033ffff33ffcc33ff9933ff6633ff3333ff0033ccff33cccc33cc
-9933cc6633cc3333cc003399ff3399cc3399993399663399333399003366ff3366cc3366993366663366333366003333ff3333cc333399333366333333333300
-3300ff3300cc33009933006633003333000000ffff00ffcc00ff9900ff6600ff3300ff0000ccff00cccc00cc9900cc6600cc3300cc000099ff0099cc00999900
-99660099330099000066ff0066cc0066990066660066330066000033ff0033cc0033990033660033330033000000ff0000cc0000990000660000330000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000199e9ab4000000097048
-597300000ec300000ec301c76fa8640000207149444154785eed9dd981ebb80e446f3e9d4fe7d3f9389f4967b478d142f214b899b6d05ff3de9548a050058094
-4cfdfbe77f8e8023e00838027d10f8f9fdbbfdf499ca6771041c8123029300ff9bff5c84ce0d47e00d084c057011e0fcf7fb86f9a7297f5f7fef31c0677504de
-85c0dc813e0538ffc7df3b2cd94870fecf7798e0733a02ef40e024c03789f0204197e13bc8e073f647e0e750009fd5f0d6db9680045d86bd83e0f3f546e0d881
-eedad1de228c68d07bd2deacf0f97a2110ec40df29c2a8065d85bd38e1f37445e07727b7c8ffe86b514284be3fd335143e591f047e4613614a825e0afb90c267
-e98cc06789d04b61677af8743d10d83f120c4bb2871df739d285d01f18760c854fd50d81f5cdb4f45fc7f7d65c84dd22ef130d83c05822440d7a3f3a0c73dc90
-6a0828dba3fd2a218bd055582df43ed0280828dba32ec251a2e5767c2702b420ecf95b26a1107a25fc4e1a5edb2b17e1b5e3efde0f80c0a789d04be100a47113
-ea22203c28ecb62654da511761ddf8fb6803202088b0dbaf7a5d840310c24de88f80f0a0d045d83f2c3ee39510f834115e2936eeeb451070115e24d0eee6b808
-8c24c2ed096bb1f5e1b848ba658e4026022ec24ce0fc3647a01602c2cba3dd3666844a58cb6d1fc711180701e1e5d17e2264158e039c5be208d442c045580b49
-1fc711c844602c115229cc74d26f73044646e0a3443832906e9b23908bc060224c97c25c27fd3e476064044613614a8523e3e8b63902d9080c27c2b80ab37df4
-1b1d81a111184f8431150e0da31be708e42330a008771f087dbcbe96efa1dfe9080c8ec090223c15c3c14174f31c811204c614e1e4917f2ebb24ac7eef272130
-ac083f0944b7d5112841c04558829edfeb085440c0455801441fc2112841c04558829edfeb085440c0455801441fc2112841c04558829edfeb085440c0455801
-441fc2112841c04558829edfeb085440c0455801441fc2112841c04558829edfeb085440c0455801441fc2112841c04558829edfeb085440c0455801441fc211
-2841c04558829edfeb085440c0455801441fc2112841606c1176fb487009847eaf235086c0c022fcf99bff5c8765017edcfdb3c0795bfe56607f1cda3ad0168f
-922dc229868fbf62234203ac12fc1215be95ef1392d18fa24f7a7cab6d4da8b30efaf30b83cff4fd5d92514136ba0ff25b36c87ff8777466b2fc18d4399675f1
-7c6ab0fac8a1d2b0568709c9ba4eaca32d706923cf215decd02e676bcfa10a85fb561ebda5d0de2647d9a61e572c7ec75538fdf39ec253fc49b347b343329846
-c9899c5009b7c3fefc4693ea7f763f12e178d4c106b570e64bd28b1c1c23ae3cf1a24f5b9d439a19d08d21bfc2c7279f9acc13e2524b7684b672b9be245f1c0d
-8efd130dfe4d575002da0c1998449850e03d98e67c1289c15683356b61207d054a43068e213f766528a1ec042df24b944981e6e82d892c98c928dbc44527a50c
-4890537c37f13cdb12877abd4de22f436b0c9b41841248931f150ac95e837ff981dd859cc1db06b02ca59fa21df3818cba6539cfe932b20a49b3f05cf8cec364
-97b67877f29ae4961afdd47b1faffe11287ca3b80b634cf6e2305b4764116a73afe9a454869b05e15d8ed9917dae00336899ed475058e1dd275c91e7e06988d5
-79fe445f2a8d9b1b7c818989655e789db413d48fa2f2593f290f240816500d32145c9f6d521d78f435b99158997a2c84c50d6986025720ed7e441b9e7386d541
-355543e10be820fd187fa4914db66e57b04a3e0ac663df836e87d9d8a2833d559158ce9700782db355f66822d4f5ffb0203714b3fbe74258d49052c3970cbe4d
-86a9a98e88585891dae93b10c6366cccf74813ace824d931263a1aa54e055895deff7dce67637038ea7668451508229c2a9302fee11a1b7b77c13917c2fc5248
-2b71f64c04724a1d40a39d8fcaf264679b68464ea8c218849a71697435ffef052910f1948a527bf5ab53775becf209ac0c25e70f586a51137cffa7e4a8402035
-03ceb9315408334ba199ea213e4ae944c0711bd78c802a66d8c9964a4267194aed18ed6c84aba134f4fe56e196958319689f5ad24c68a5be80c913de89e60a32
-ada8f2b6534285304b84b92bc1936f0aad18905752ca0c28961881956ce6f68a93f095dbf392af2294e3c86ccd424165e8f350fbc9b2a15544c022644fe35720
-6d42320d8bd03c541ef491d68cd3094ff70c075f1a411430c8264a22c407194aa63358812b149a1d93a1608d794ff165c75685c24cd1e535c3d15684893787a2
-a685bb516329acd2876e60e5ec2e28607539b30c6e973861ec0a889250c05ef88297864d24ebdee8d16f81bc3fc23531ef5f41cf5c90ad0333770a6c54725786
-0ac385d0b435535b820a9202900b9fcba492c8aa65033311d7a995a033ebce6e28d69fc7e5bbf88a8447f7ca5b923625150adc51708f5fa3aca7b631891542bd
-143690a0a242ce9693084be3195f6114b14d5f5048d3700376ba4221d9b91b970ab33274aaff2f97082da5ca67201f8d2a2c16a14413323af0efe407cffb5758
-0653599567cf7039d04a49b427d29d45aa0c1b4a40594e196e9af3a6e1f2c8a5b43953610a32d2169258372af6a38dc838fb58bc2d420f1209c8e5dfc3562824
-96863f5c749e4d19c5de8f2a610b8dcaed87626ffc9a5b0d0d22753a8890d8bbcb8bf142a8f4a3d51e4a84c202f9ac07929359412b5acd1de0bd2217cafce74a
-a84825947e146b94b1a3d7d4996000ea58625222c2d20517450b1ad2d659f96e5e888bada60ecc25d55c5bf3a3b57c411649d6505c3bfc7b1a90563974e798a1
-3d8977a3d88fb60f487ac3a14ed244466456271c37704190f7ca40b47e3e02a940171cb30b7d158fe19ab402fa78a107656811a6a1549854219ee703249ac530
-98bf15370d5977d1a352c9c3c5a406a01dc6483783cd02b8f74ced4f52dd282e0a955096019e2c85ed2bf16afc29a3b5f23bcc1c8931b68714ca90115db7f2bd
-8c27e7bb930250fcaf6090ba2c2c12617b5f9215bdfdf46b208e5836137f84380aeff5d6477d812132a252972bf0b778882198234625d58de2a2b0c26338003b
-9d4b8a23250e7028338a28c4917797c59c55786feb47150f22b5553126c7f9daf72401e995bec5a3f0ca4428bd5455046fb2ab50b85434fbfde67d42eb5d08a5
-27676ae7b3be4d2b801223f1a788300988028080115f22e5c674378a8bc27fcd08f9f02f59d07b89700fa571d6fbf9dbd349abd9559fee9c0756370166112a51
-8b01df8dbfccf0f415a955723f2794b0948a50da662b813399d07a65e59d1196001e8f724c1e00198f97e2a79473efc454441de3b0c5fd92c017df9ba27f3f27
-94b0a4bb51ae8452675384672aa129e42c9afc71f3d6087dd2c8f14d91435a12e946e18ca11f55868b9247b9b90ae6a5838c2142a54321117235d53999876aca
-02a5adca9bf570d75684f280894e3a743c4eca51a57471a81e5e28b0c54793fd7ff385a9854c462679ac2aac5e09a5b05c8496bd99f51345b838daf999722203
-4b2b86ebf51b4aaa73d20935c7df7f15f7dde276f8a444216f26acb123f8fabe40fcac441e75fd928c76a2fb3c5a4de26cbf78c1875ded7dc127b8b42414fa51
-69953f7f3663975bf553116b62c9918e5cb1b15d60f03c88d21deede7e2f7eae25a4dc3b1f0418128309776f2f397e6f22eb7de3fdf9c8da10f588733a7f4b33
-e08e02c6a58608796f26fce59c1a6c361262bdfc9910f0ccc4e7f01b85289de1be762652e1ab1c8268955931e5de2f28eb462d9d4ff86c78c5975d60cf6b6b85
-3b2944d576265a51150cef3e603aa66e54a984b03713ffd68288448a5b76111e12b308e6269b69539a7b43b841619d3aa730568a381a00cb5591cf1a18469873
-6668792a0c514784b15585a118525c5884ca723f1ed5f4e7013415d614e199159a0d2f116ad763f63b6eb7d20dcab4d8f7e8dd688a3772218bae8ac5ccb7b62d
-d9bfa9ae22c204a6320e14973a228c3104bfef2245a39e0883f64836bc7014cac8441d4a7e079f7ef95b2642c849c8866e3485b960c9229f0406421dbb5f121d
-8487a821c2a47ed884fb15b04ea823c2f0761b4a70b24d0968e9d6fd03ab5862566c78055413a1d23fa84bb8f53a655e6d5661a424f714bce0d841c184b59d8d
-63c4565410613a972add09a5a3f91d421621d5d215a63324da7d4a19aa24c228a00a96af8072f067dc6d0253ae56acd4eaaf90c0cbdf154c9ba2841dfa0941c7
-a90d310104ee67041b2897d414e191224a155c3012c0a822c2544e10746514a1d8182ae27b5e63b23231b22280a4618a215093958c025fc913dc281521e73401
-8a85e0493cab55c27db7244b50ea476b883089a790d05eaa12b286f690d0a440b11f55c614bc4d7731cc3cce41028ad04a093a2e14216b507b444e5b044237aa
-b595dbc714f4aac80e1b8112e522048b84a43a800805d649fb41ac21188607e0b5298f41bc13e02814a192d1d80fee47151132a2fb8d0321816cdc1304502cc2
-0af1348ab0c19a506a1ac8d37905c245a8f8bd01a60c92b74631ed204281bed88f5614e17d6f46a0c10e1b8113a52264932cbce46be72b98864a9edd5f23340d
-82f8855100301490e03d5af1212254f634880f354538cbc9d489ae146352178a50a8cc6c83b512b2f0ed2214f295d08fb28448433c02a7a0af11213ab2722bf9
-831a45852a5dfe844f529dc76201148a50309f69651521115930ea7c099bc91110944c4588cdb89008c57e34919495cd51e9edd185303f8c7d807b5f2a426272
-8e0a85ac8bd30aa4a1d6611011b2191dd6844a2737333cf5836da510b6e8ac36f030961f5909b926d965285431acc00c778521381b633ec16c22bc6cd5458402
-a0e92785752ba19d55f31decc4678a50fa41a11132c68a1685828e91fe6cc5954488e9646df5e290b80857153090c6376670356e54dffd72a197040909235037
-5a98365757d00e4c0582195d2a2173079e144adde805da5106d2fa02f7aa42fe6d844d8c421d838714ec293fe5a85109d1938f11217ab25221ae224d84dc5cd8
-a8b4bfba2ca47c3793ca5609051a6ff69af6c73294e0b4dc2bb89b2e64bc0dc639978d60c62075bf4d84717f5c84f676141ba923cf8f67ac942851983c2922e1
-7eec46854c7025110a0fba174644c3ee22b48b107378a0d81c4fb9cad6a132796a70a18cb36d5e097718311c2ec2daeda89af94e05317ed60ef3fe798510f154
-19aad18d7a25b4aea7d2dba35e09ed9550d84a8d52fd7828be417dfafe68a21f15ba51ee245d8459228cb6f91d45381fdafaf7773ef8b730b50bb70b4ce72e6d
-b3ae16989c2a38654214fad1c49686c9cf286e8c392b19fdf8988d193529c772a3f698d0f00bdd60dce62393396e09deb67f586f2227f2877bbe823d5301c938
-5e6c19ef8d2a5bb42ec233d285225402134e9bfa91e5297a0c2642a11d63b24f0f8ef627920bf55a7bca9d78635fa8e12c1f17e121549cc1d767c691088b9530
-4f84255f1dd8937834110a5c5654389f04ae707e1f3ca10e473b39a60b3781d2c34a760bdd604bb8274824369c3ff550613f2ea3fa2611eae7cb0b741d4d84b9
-fba32157ed3a64ee45f783f9567e48e8223c4a7b5011eebe7322a80c2e194e8422eca2e7c67228d4e1889484eccf25cc45f809223c7ef14ba4e2e76ccc48c7b4
-98bc36bd622a4829b27ee0dcc13de0cc402ea8ac65f4824d6133866a4763fd498335617d09a6cf6be148547f583f8596e96c12a1ed58906c97f946a91b751166
-ad09bb89b08504471421e671a306a7cbf5a654e847839548305adba265317b250c10a0d3ee68f502b1ba32dc9ab041299cdcd4ca90d40c07fb5116afb80dee22
-dce949657d17111a3ed8662b14038a5068c96c3ece578b1a10e60e2ea8583b621ae0812e550939b9ad54e82142d5163b394714a1d0dbd91de5cd08f5797d0032
-c162ad1b1592c0a5442800db4b846a51b65373c47654389f21c351f1581a21ea819ac649b25e257611be654dc82d4a0e29875d13b6d8219d9dd56a21831dd013
-dfc4d2594b658d91309130126c469f4714e8ca9df9addb51d58e3c218ed88e4e887269c97097b9a7cd7c8e381a234ded223c21ab92bfb10855339007e10b0615
-611b152a3da180f7a91fe594a1ccec95f02c25211a3dd684dc1864ca6fe476748a860abfc97b450b0cf869145eb3abdda8b7a37b21727aebb13bca9430b1f074
-f1a895b0d1c250108310f763c6c610c8dda88b70c0376638c72201d2170c2cc2262da9f0a480113d80c6b2151f12fac6cc313c2aff5bae0939bccc98cf15618b
-9767848694037f18846f100af09d46dcf9f058d8c973616633faec8e32b4cddb5144b3548243beb6b60d6ffd378598c39cf90e2446c60aca7f388d63e1276584
-e5f4d789b0e52febd53c50a0c591dbd1f51516a6a5c97d26a0f0bbe21d6a9c2af56ed4d784596bc28622e4e89ae817bc7878114e89bdae0c59119cfb766370e5
-1416a25e098320712816563714615df27dd673c25d48aafe8a8b4b21ab6ad75f22510cdda857c2ac4ad8eeb435e6c24957b7e9f8d19fe9efee89504a3fa012ae
-5d29525dee0a7855c8436da9825773ed7d0dc78997cdc7b0731e623386da9869274206621bfe497d275c301ac36fccec3669a6335691f0c2055c9858f01b5d31
-c8866ed42be158959083fb225ce4530cc2109f52091fb1293eed78020d45c13dc846c8a85816fdc6204e335e09cf89368649f1193318dca72dd1d31bbe50842b
-5fcb0e3e661a633ddd3474281b9ece4518cb8b08ee1aa966224422dc2fb8c583cc197dccdf1362a92a532297264e802fd0294ebc00dbbacbac634d63ee6593d8
-8c3e6b42b663813f664c69251404b4cc9f621473e99345f85022a9e0bc7d852267f09f8b42643c4bde45180d481f1146f39a20a0995dc99d37618c4f5b1386c2
-65de394511f2f3faa7b450af5cb95c8485226cf6b96c2dbfa7d3ec4544383fc11053667a09f1e20222f78c3b5dc9addf8e81ec078b1a8b33dbc466f469474b55
-50f67d420472310fd024822496b433c61c09de68545ec2664e70e932bd57c30feeb0be3dfb78a209cfe5228c8797d05dff3d5e8aca44c82cc06654e1ffc7af09
-37f1d320a375f47d408cfe5d5c982c85fce1ed68746305c3b05c106f0eca442814312c84ca89f2dfb0267c841005f108a9b05782f8dfc720e50b5379258c262a
-31a2f144572642a115e4136d91491ff5c68c505324d43879cd8b4cccc1ab3904b1b11b159600575a1372146051a68930c62ce440ba0c6b0cf9a635e1e2b19839
-95452806601503c95ec81c5e09a320518aa325e13fed4161910829c2820fdfd48e4a054cd8cf924adcfde11068d5da8da2a8d3bdcb4a084c459c8428b724dffd
-c3f927d088baebbfb319b033522442c50fda1be55ee9eb2aa1183626a1d08f2efaa23859bb518176576a47b11d817d99b24a48c1859dd97b9eb95e2514d672fc
-6467450f09305f448b162de16faee2dc7f21114a2a481765695118891205d74558d2c72b9510b75c968d714873e66ed42be136ae920a922f6e16b5a3420de3cd
-51a208eded7056565a7b7645d2845a5304a3b98f578adcb22884d9b86a1ddd62f3794c2c200c389b918a073611e29a90a9830fcb954a1843549a1ef3ac30ca97
-6dcc606d5af8c12454fad119fe3459b579767466f65f48840c06d5917fcd4588e1701186733266af4517881e2e1ccddb32a46ae4dc62f8db2ba1201ea5b1413f
-848cda5c841863018c112b21fa958a204a678a9c26425c91fc10dd314b9e1de190f1a0485eaed06c46610c14112aa1a42fa13717217289a11cf1ddd1dfff12bf
-53c6e0299113554e4b9b5f2896cc7517612a9e027de121dbd415082a8cd9a0508913bae0c5809570b63a5f8682cfc221d6523ffa072214b5fe7d6b422cc5d2c6
-0c76224237fa19222ccc44589884a5d5619fe48e7df4e01c98b2a208894b37d89711c0395dc2e67f403bcacf58956d758602f7463b54426c77d88de4107cbb82
-2517f5bd11cf59b1db0e919c84b3644f551d04407ab22cfb69ca4f786d4d49bcdc256885906229b4a385875b109938a249a2f0ed0481b4c9b8af845bec3368cc
-9257f76526db8907e9c9986781f831e69f5009093865738c9198f3295284d7845140a5849e3e60069f6261311760a034a0ecf4ef45b89fd4dc94d2660a3abdf3
-08464b032460f3a51b33c23b7f281f259be2b6cc4c3ffc2b1421a501565132adf2edf52be12987da6428858e6bc9431cd27011a55270c21a65ccd97acce0b88e
-a13781b0a557804b6ebe09b5547bed0235188f13e2b846be7493221d0d260419606f470373def4be4e828d29f884551a2f2242ddea6d1419f38f10a1a6a138ff
-b5fbe921e10c2c2f0ae32252da2a2ce918d174b6c6db310b98451806ffa6964309354b89122088cc6990fa178a5028a54b218b642aa5906a85b0488462f493a5
-90d3493aab0a3608eb1e065439533ef2b58dddfce2870cb994bc46650863bab7487de30563cee663fde604c16640e439ea2b702119eaa02bdd06f5a3093c4527
-52a1665f20181c89daed68d264d22172ef1e762171bc2e916a6be822d64ad00ec69c0746203a88507854f8406d1f57cbb728d90f61672681272b68f5213e8430
-02241226446d11d28c291d8a690bb794f7da50473dea50e2c7d73ea29036c53790dde60f6bce7f44803dcc4a21c4edd18408319bddcd89065b600f11454044a8
-2a6cc8d30e216ffc770b0b916779c44f307973891a87a308257e7cb308c5556176a731b7b2522869672635886a5dd81269794444e92e4261c27521317f8ff805
-def4a134152ddccb3a8544b5e96001378d5ffd8862724ec9a87ad8f23bfe1211cabc0aa950ba191389c03f2117b12d0f43ac55e7b6fed9222958bcdfedb10d4f
-0d0a4dcfdeb0bc11478cbc50c6c811e5a79159d03e6f52b7bed23b334938f544727ae8297e1d05a3c984a8bb2614e62b0bdb743755ff33b7b2acb24f739f9867
-c3b0d1af1c953e8ecd6011622e280c265bb05e512042c3f6d27fdbc7683feae296130947a2aa085b076d6964d5c8bdaed3b3e18654f669be4f848d1b5239cfa5
-45988e14b771dbeda57991f463f98ab440c7ce2214a62bcc9dca4f10aa94424e70b1d833081f5309951f53e407548738bd284c8bb07161e0580a0b839a95b0b1
-bf4bb8f5c86d6263ca862babe42c9db10fc48143243901732e906a3d0f93ab4276e16560aa14129aed3c1069221820848239bc022acc961bb1c77d96c86d3cb3
-4f2bc012b9845120da0c70d0d3d3374c077668ef77300a754498b51811bd924a0213a262256c17af172496c895944209ddb00a19737602a1e464c4666879064d
-11f97abcccd46aa4fa51748391c87441dc9f10e6471f9485c1c20961b25c6f1ff7317d23ee5827ce9e4881810747e6f71361a3cd195b962b1261b352c841501b
-c46a2244e2588570bede943d778e7147bd9b4d8437881de7a2cf12611315da34987a48c160b6aa0e2a499810f5da5161ae42195a23b7d588cdbab633316f30a1
-3101d86121fdae97d42f256cfec1b8f8ce8ce005a299c54bd9078e443511b6f1740b4f89328c446299c463cf98f3e808263380cd10e87bbfa4b60ad9faa36df1
-7e54f1a2b6fdb66d7a8e443511fe13dff2c9ca3a650f0dd4cefc699a9d241b2a30e61f27427e83c714d51c7863a590b19c43635c8d08de1856464c887a229cda
-16613ac1bff02506af83c9118bcb66daa2b91804260e1acb3c6633941af2bc86879323cbb6072c8b9542d1898ae62f7e72085f8609730b5e701e79e0da4e8616
-afc32eb1174f1a154dc698f3f0e389b05e31c95b554444c850dec9c051919388f5d54961eaaa229c1e330b531adcbd5f9a953c8f9ec9d3e6d1e4311d03c0cc19
-5084b5229b0b6eb81f6528ef614144657698dfa66242d46c47577f2da71b889ee7066e2f4379795ed48d0a1be2cc1ca40c67250ebd907ef797187a896860b3b1
-0d9742830f0c88c646f5c8324b272fb8c1e0ef39515986f99f9639f8c67eac611020495cc2c1fe54119617c39250864a212369da31135498e1011342611c93f7
-94982b2e0eb373e75928021c531c0aeb2e4fc2d419b3124e8096c5b508d95029b4a54be631a9d07080eefb366636a0542a8745713bc608b9bd04a150f55f2dc2
-12199afbb8632373aa859ccdf643146e58dcf2c8c88468540917e72d07c784735069dcb254684bafa7ab1973e60e668bb7ac091f7b1c591525a38f3b407b2e85
-f6486599be7233ab0ace1632215a8ab054877989271919211796ceca987fb808a7bd3773575a259b1e2ba15d83f9bbf7050e30211a8b305f877450704e04e67b
-3017b244d25333e63cc3d0957071dfa2c36aa1dcab90610c062a639d945d0417039810ed4538474c3d35e7d194de7e331116a4092ae4464f98e31a97fc0a618d
-1c329b07d0be21cd1bc34cc7965ccc7621f34625626bef5d2d71861321ec809576a399f07cea6d894391a6b3656be7d2ad0a8b1013cb42632e16b9907b331e63
-3539ddae04ae56533bda7afe5cec86beefe7675fa47eb7273bd7b4fc354df1a844c60e5c2cf6217b80f944b9bfc381bff3970c9acb6fb5183a74ef46b303dbe7
-c6755d582b55ce4a3c32622663ab24d207a3d167a177d70a1f128eeefe37d83795ddfa6e4c83ce7ff507f611cf08d0569563e60838026d11a0bd7fdf96698bbf
-8fee08e0b68c77a34e1247a02d02540895a7a66d2df4d11d812f47809e4f7837fae50470f7de8e001642df1d7b7b8cdc802f47800aa13f24fc7202b87b6f4700
-0ba16fcbbc3d466ec0972340cf087d5be6cb09e0eebd1d017a59a6f45c8bb73be8063802832380cda8e944d7c19d75f31c811111c066d4b765460c9bdbf44508
-60335a7ac0d31761e5ae38022d10e066d4b7655ae0ee633a024f04b019f56d19678b23d01401d6a06fcb340d800f7e7904e85599f273b72f0fb103e008241110
-34e885d039e408344440d1a0ff7ea261007ce8cb23a068d00be1e569e200b4434038f87e3eecb49d013eb223707104f819fd7218b0ff90f0e23c71f79b21a095
-c1e24f1236b3df0776043e1c0155825e083f3cd06efea808183edfe55ba3a306d1edfa64040c122cfd48fd27c3e4b63b028d10307e22d84fb56814071ff6aa08
-983f02e98f27ae4a15f7bb0902c61ae88f279a44c107bd2e02390af4c713d7e58b7bde0001e1f74ae7cff47a33da20123ee46511107e3d7f16a1bf2b7359beb8
-e32d10c82885be33da22103ee67511b097427f4c7f5db6b8e76d10b09642d7609b38f8a81746c0580a7d53e6c25c71d75b2120fd80f7b13be31a6c15061ff7ca
-08584aa1f7a257668afbde0e01bd14ba06db45c147be34027229f4671397e6893bdf1201ad14defc197dcb20f8d81747e0fc52ccf9fff156f4e22471f7db22c0
-a5f0e6ad68db10f8e89747804aa197c1cb53c401688d40ba14fef96ab075007c7c47e05fe2e535df90717e38023d10881ef8eb55b007fc3e87233021102e852e
-41278723d00d814029fcf31dd16ef0fb448ec0b914ba029d158e406f0436a5f0e60aec8dbecfe708cc08acab4217a0b3c111781b023f7f7f3ffe40f06df0fbc4ef40e07fe66a76e6cc5765320000000049454e44ae426082}}{\nonshppict
-{\pict\picscalex17\picscaley17\piccropl0\piccropr0\piccropt0\piccropb0\picw23816\pich6616\picwgoal13502\pichgoal3751\wmetafile8\bliptag1016976793\blipupi95{\*\blipuid 3c9dd5997eca05e5285611ada434fb29}
-0100090000031add00000000f5dc000000000400000003010800050000000b0200000000050000000c02fb008503030000001e000400000007010400f5dc0000
-410b2000cc00fa00840300000000fa008403000000002800000084030000fa000000010004000000000000000000000000000000000000000000000000000000
-0000ffffff00fefefe00cccccc009999990066666600333333000000000000000000000000000000000000000000000000000000000000000000000000002222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222355332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-02022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222226000006542222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222400000000006542222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222226000000000000005422222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222400000000000000000054222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222226000000000000000000000532222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222400000000000000000000000053222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222226000000000000000000000000006322222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000000532222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222220000000000000000000000000000000052222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000000000064222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220000000000000000000000000000000000
-00522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000
-00000000000632222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222230000000000000000000
-00000000000000000000042222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222500000000000
-00000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222230000
-00000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22250000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-02022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222223000000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222260000000000000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222223000000000000000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222260000000000000000000000000000000000000000000000000042222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222223000000000000000000000000000000000000000000000000000032222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222260000000000000000000000000000000000000000000000000000622222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222450000000000000000000000000000000000000000000000000000522222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222224500000000000000000000000000000000000000000000000000322222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222235000000000000000000000000000000000000000000000006
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222450000000000000000000000000000000000000
-00000000422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224600000000000000000000000000
-00000000000000000222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222460000000000000000
-00000000000000000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222236000000
-00000000000000000000000000000000003222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22360000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222240000000000000000000000000000000000000032222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222236000000000000000000000000000000000000622222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-02022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222225000000000000000000000000000000000000322222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222225000000000000000000000000000000000005222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222225000000000000000000000000000000000003222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222225000000000000000000000000000000000052222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000032222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000522222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222230000000000000000000000000000000000222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222240000000000000000000000000000000004
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222260000000000000000000000000
-00000006222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222300000000000000000
-00000000000000003222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222400000000
-00000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-60000000000000000000000000000000022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222300000000000000000000000000000000422222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222500000000000000000000000000000006222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222223000000000000000000000000000000003222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222225000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-02022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222230000000000000000000000000000000022222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222250000000000000000000000000000000422222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222300000000000000000000000000000005222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222600000000000000000000000000000002222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222224000000000000000000000000000000042222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222233322222222222222222222222222222222222222222222222222222222222222222222222222222222223333333222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220202222222222222222222222222222222222222222222334556600000000000006655432222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000622222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222255555532222222222222222222222222222222222222222222222222222222222222222222222234566000000000000000665533222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222202022222222222222222222222222222222222222345600000000000000000000000000000654322
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222250000000000000000000000000000000322
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222333555555555555543322222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222235555555552222222222222222222222222222222222222222222222222222222222222222234560000000000000000000000
-00000065432222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222245600000000000000000000000000000000
-00000065422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222300000000000000000000000000
-00000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222223456000000000000000000000006554322222222222222222222222222222222222222222222
-22222222222222222222222222222222223555555555552222222222222222222222222222222222222222222222222222222222222356000000000000000000
-00000000000000000065422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222223560000000000000000000000000000
-00000000000000000064322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222500000000000000000
-00000000000006222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222456000000000000000000000000000000000654222222222222222222222222222222222
-22222222222222222222222222222222222222222355555555555552222222222222222222222222222222222222222222222222222222223560000000000000
-00000000000000000000000000000064322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222245000000000000000000000000
-00000000000000000000000000000542222222222222222222222222222222222222222222222222222222222222222222222222222222222222250000000000
-00000000000000000000003222222222222222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222222
-22222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002
-22222222222222222222222222222222222222222222222222222222222234600000000000000000000000000000000000000000542222222222222222222222
-22222222222222222222222222222222222222222222222225555555555555532222222222222222222222222222222222222222222222222222223500000000
-00000000000000000000000000000000000000000642222222222222222222222222222222222222222222222222222222222226000000000000000000000000
-00000000002222222222222222222222222222222222250000000000000000000000000000000006020222222222222222222222222450000000000000000000
-00000000000000000000000000000000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222236000
-00000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000
-32222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000
-00000002222222222222222222222222222222222222222222222222222222222346000000000000000000000000000000000000000000000005322222222222
-22222222222222222222222222222222222222222222222222222222555555555555555522222222222222222222222222222222222222222222222222223600
-00000000000000000000000000000000000000000000000000005322222222222222222222222222222222222222222222222222222222260000000000000000
-00000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222222222222222224500000000000000
-00000000000000000000000000000000000000000000000000532222222222222222222222222222222222222222222222222222222222222222222222222222
-22300000000000000000000000000000000000022222222222222222222222222222222222222222222222222222222222222260000000000000000000000000
-00000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000
-00000000000000022222222222222222222222222222222222222222222222222222222350000000000000000000000000000000000000000000000000000632
-22222222222222222222222222222222222222222222222222222222222222235555555555555555522222222222222222222222222222222222222222222222
-22250000000000000000000000000000000000000000000000000000000000642222222222222222222222222222222222222222222222222222222600000000
-00000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222222222222222235000000000
-00000000000000000000000000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222
-22222222230000000000000000000000000000000000000422222222222222222222222222222222222222222222222222222222222222600000000000000000
-00000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000
-00000000000000000000000222222222222222222222222222222222222222222222222222222460000000000000000000000000000000000000000000000000
-00000005322222222222222222222222222222222222222222222222222222222222222555555555555555555322222222222222222222222222222222222222
-22222222236000000000000000000000000000000000000000000000000000000000000065222222222222222222222222222222222222222222222222222226
-00000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006020222222222222222246000
-00000000000000000000000000000000000000000000000000000000000000000000004222222222222222222222222222222222222222222222222222222222
-22222222222222222600000000000000000000000000000000000005222222222222222222222222222222222222222222222222222222222222226000000000
-00000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600
-00000000000000000000000000000002222222222222222222222222222222222222222222222222222460000000000000000000000000000000000000000000
-00000000000000000522222222222222222222222222222222222222222222222222222222222235555555555555555555222222222222222222222222222222
-22222222222222225000000000000000000000000000000000000000000000000000000000000000006422222222222222222222222222222222222222222222
-22222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222222222
-35000000000000000000000000000000000000000000000000000000000000000000000000000006322222222222222222222222222222222222222222222222
-22222222222222222222222250000000000000000000000000000000000000002222222222222222222222222222222222222222222222222222222222222260
-00000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222
-22222600000000000000000000000000000000022222222222222222222222222222222222222222222222222360000000000000000000000000000000000000
-00000000000000000000000000632222222222222222222222222222222222222222222222222222222222555555555555555555553222222222222222222222
-22222222222222222222222600000000000000000000000000000000000000000000000000000000000000000000632222222222222222222222222222222222
-22222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222
-22222235000000000000000000000000000000000000000000000000000000000000000000000000000000000522222222222222222222222222222222222222
-22222222222222222222222222222224000000000000000000000000000000000000000042222222222222222222222222222222222222222222222222222222
-22222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222
-22222222222226000000000000000000000000000000000222222222222222222222222222222222222222222222222250000000000000000000000000000000
-00000000000000000000000000000000000042222222222222222222222222222222222222222222222222222222235555555555555555555552222222222222
-22222222222222222222222222222260000000000000000000000000000000000000000000000000000000000000000000000053222222222222222222222222
-22222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006
-02022222222236000000000000000000000000000000000000000000000000000000000000000000000000000000000000622222222222222222222222222222
-22222222222222222222222222222222222222200000000000000000000000000000000000000000522222222222222222222222222222222222222222222222
-22222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222
-22222222222222222222260000000000000000000000000000000002222222222222222222222222222222222222222222222236000000000000000000000000
-00000000000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222555555555555555555555532222
-22222222222222222222222222222222222230000000000000000000000000000000000000000000000000000000000000000000000000004222222222222222
-22222222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000
-00000006020222222246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032222222222222222222
-22222222222222222222222222222222222222222222225000000000000000000000000000000000000000000322222222222222222222222222222222222222
-22222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222
-22222222222222222222222222222600000000000000000000000000000000022222222222222222222222222222222222222222222225000000000000000000
-00000000000000000000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222235555555555555555555
-55532222222222222222222222222222222222222222600000000000000000000000000000000000000000000000000000000000000000000000000006222222
-22222222222222222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000
-00000000000000060202222246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042222222222
-22222222222222222222222222222222222222222222222222222300000000000000000000000000000000000000000004222222222222222222222222222222
-22222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000
-00062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222222222222222222222600000000000
-00000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222222222355555555555
-55555555555522222222222222222222222222222222222222260000000000000000000000000000000000000000000000000000000000000000000000000000
-00032222222222222222222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000
-00000000000000000000000602022246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042
-22222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000000000000062222222222222222222222
-22222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000
-00000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222222222222222222222300000
-00000000000000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222222225555
-55555555555555555555322222222222222222222222222222222222225000000000000000000000000000000000000000000000000000000000000000000000
-00000000000042222222222222222222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500
-00000000000000000000000000000006020223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000005222222222222222222222222222222222222222222222222222222222222400000000000000000000000000000000000000000000032222222222222
-22222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000
-00000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222222222222222222222222222
-24000000000000000000000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222
-22235555555555555555555555555222222222222222222222222222222222222400000000000000000000000000000000000000000000000000000000000000
-00000000000000000000052222222222222222222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222
-22222500000000000000000000000000000000060202226000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000005222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000000000000000522222
-22222222222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000
-00000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222222222
-22222222400000000000000000000000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222
-22222222222555555555555555555555555552222222222222222222222222222222222230000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000062222222222222222222222222222222222222222600000000000000000000000000000000002222222222222222222222
-22222222222225000000000000000000000000000000000602022230000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000004222222222222222222222222222222222222222222222222222222222500000000000000000000000000000000000000000000
-00622222222222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222
-22300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222
-22222222222222240000000000000000000000000000000000000000000000000000000000000000000000000000000000052222222222222222222222222222
-22222222222222222225555555555555555555555555532222222222222222222222222222222222600000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000062222222222222222222222222222222222222226000000000000000000000000000000000022222222222222
-22222222222222222222250000000000000000000000000000000006020222260000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000003222222222222222222222222222222222222222222222222222222220000000000000000000000000000000000000
-00000000000322222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222
-22222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222
-22222222222222222222224000000000000000000000000000000000000000000000000000000000000000000000000000000000000052222222222222222222
-22222222222222222222222222355555555555555555555555555522222222222222222222222222222222240000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000062222222222222222222222222222222222222260000000000000000000000000000000000222222
-22222222222222222222222222222500000000000000000000000000000000060202222300000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000003222222222222222222222222222222222222222222222222222222500000000000000000000000000000
-00000000000000000005222222222222222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222
-22222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222
-22222222222222222222222222222300000000000000000000000000000000000000000000000000000000000000000000000000000000000000042222222222
-22222222222222222222222222222222223555555555555555555555555555222222222222222222222222222222222600000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222600000000000000000000000000000000
-00222222222222222222222222222222222225000000000000000000000000000000000602022222600000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222222222220000000000000000000000
-00000000000000000000000000002222222222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222222
-22222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002
-22222222222222222222222222222222222230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032
-22222222222222222222222222222222222222222255555555555555555555555555553222222222222222222222222222222240000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000052222222222222222222222222222222222226000000000000000000000000
-00000000002222222222222222222222222222222222250000000000000000000000000000000006020222223000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000052222222222222222222222222222222222222222222222222222500000000000000
-00000000000000000000000000000000000042222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000
-32222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000
-00000002222222222222222222222222222222222222600000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000062222222222222222222222222222222222222222222555555555555555555555555555532222222222222222222222222222222600000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000042222222222222222222222222222222222260000000000000000
-00000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222226000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000032222222222222222222222222222222222222222222222222226000000
-00000000000000000000000000000000000000000000522222222222222222222222222222222222222222222222222222222260000000000000000000000000
-00000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000
-00000000000000022222222222222222222222222222222222250000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000052222222222222222222222222222222222222222235555555555555555555555555555522222222222222222222222222222230000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000032222222222222222222222222222222222600000000
-00000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222230000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000622222222222222222222222222222222222222222222222222
-40000000000000000000000000000000000000000000000000000222222222222222222222222222222222222222222222222222222222600000000000000000
-00000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000
-00000000000000000000000222222222222222222222222222222222224000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000042222222222222222222222222222222222222222555555555555555555555555555555222222222222222222222222222222500
-00000000000000000000000000000000000000000065332334560000000000000000000000000000000000000000622222222222222222222222222222222226
-00000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006020222222260000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000422222222222222222222222222222222222222222
-22222222600000000000000000000000000000000000000000000000000004222222222222222222222222222222222222222222222222222222226000000000
-00000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600
-00000000000000000000000000000002222222222222222222222222222222222300000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000022222222222222222222222222222222222222225555555555555555555555555555553222222222222222222222222
-22222000000000000000000000000000000000000000000053222222222235600000000000000000000000000000000000000522222222222222222222222222
-22222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222300000
-00000000000000000000000000000000000000000066666660000000000000000000000000000000000000000000000222222222222222222222222222222222
-22222222222222230000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222222222222222222222260
-00000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222
-22222600000000000000000000000000000000022222222222222222222222222222222226000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000522222222222222222222222222222222222222255555555555555555555555555555532222222222222222
-22222222222240000000000000000000000000000000000000000063222222222222222460000000000000000000000000000000000000322222222222222222
-22222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222
-22260000000000000000000000000000000000000006553322222222223450000000000000000000000000000000000000000005222222222222222222222222
-22222222222222222222222600000000000000000000000000000000000000000000000000000032222222222222222222222222222222222222222222222222
-22222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222
-22222222222226000000000000000000000000000000000222222222222222222222222222222222400000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000322222222222222222222222222222222222223555555555555555555555555555555522222222
-22222222222222222222500000000000000000000000000000000000000006222222222222222222250000000000000000000000000000000000006222222222
-22222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006
-02022222222400000000000000000000000000000000000654222222222222222222225000000000000000000000000000000000000000002222222222222222
-22222222222222222222222222222230000000000000000000000000000000000000000000000000000000422222222222222222222222222222222222222222
-22222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222
-22222222222222222222260000000000000000000000000000000002222222222222222222222222222222226000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000006222222222222222222222222222222222222235555555555555555555555555555555
-22222222222222222222222222220000000000000000000000000000000000000000622222222222222222222236000000000000000000000000000000000004
-22222222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000
-00000006060022222222600000000000000000000000000000005422222222222222222222222222500000000000000000000000000000000000000042222222
-22222222222222222222222222222222222222500000000000000000000000000000000000000000000000000000006222222222222222222222222222222222
-22222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222
-22222222222222222222222222222600000000000000000000000000000000022222222222222222222222222222222500000000000000000000000000000000
-00000000000066555555560000000000000000000000000000000000000000000004222222222222222222222222222222222222555555555555555555555555
-55555555322222222222222222222222222300000000000000000000000000000000000000062222222222222222222222225000000000000000000000000000
-00000006222222222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000
-00000000000000060202222222224000000000000000000000000000054222222222222222222222222222222300000000000000000000000000000000000000
-62222222222222222222222222222222222222222222220000000000000000000000000000000000000000000000000000000003222222222222222222222222
-22222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000
-00062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222222220000000000000000000000000
-00000000000000000542222222222223500000000000000000000000000000000000000000062222222222222222222222222222222222225555555555555555
-55555555555555553222222222222222222222222224000000000000000000000000000000000000000322222222222222222222222224000000000000000000
-00000000000000004222222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000
-00000000000000000000000600002222222226000000000000000000000000542222222222222222222222222222222222360000000000000000000000000000
-00000000032222222222222222222222222222222222222222222400000000000000000000000000000000000000000000000000000000052222222222222222
-22222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000
-00000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222222222500000000000000000
-00000000000000000000006422222222222222222240000000000000000000000000000000000000000042222222222222222222222222222222222255555555
-55555555555555555555555532222222222222222222222222250000000000000000000000000000000000000052222222222222222222222222224000000000
-00000000000000000000000062222222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500
-00000000000000000000000000000006020222222222240000000000000000000006532222222222222222222222222222222222222200000000000000000000
-00000000000000000522222222222222222222222222222222222222222226000000000000000000000000000000000000000000000000000000000622222222
-22222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000
-00000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222222222222222226000000000
-00000000000000000000000000006422222222222222222222225000000000000000000000000000000000000000622222222222222222222222222222222223
-55555555555555555555555555555555522222222222222222222222222600000000000000000000000000000000000000222222222222222222222222222224
-00000000000000000000000000000000032222222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222
-22222500000000000000000000000000000000060000222222222260000000000000000006422222222222222222222222222222222222222222300000000000
-00000000000000000000000006222222222222222222222222222222222222222222300000000000000000000000000000000000000000000000000000000000
-42222222222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000
-00000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222222400
-00000000000000000000000000000000000522222222222222222222222224000000000000000000000000000000000000000422222222222222222222222222
-22222223555555555555555555555555555555555222222222222222222222222220000000000000000000000000000000000000052222222222222222222222
-22222222600000000000000000000000000000000522222222222222222222222222222600000000000000000000000000000000002222222222222222222222
-22222222222225000000000000000000000000000000000602022222222222400000000000000005322222222222222222222222222222222222222222222500
-00000000000000000000000000000000003222222222222222222222222222222222222222225000000000000000000000000000000000000000000000000000
-00000000522222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222
-22300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222
-22222500000000000000000000000000000000000632222222222222222222222222224000000000000000000000000000000000000006222222222222222222
-22222222222222255555555555555555555555555555555552222222222222222222222222300000000000000000000000000000000000000222222222222222
-22222222222222226000000000000000000000000000000006222222222222222222222222222226000000000000000000000000000000000022222222222222
-22222222222222222222250000000000000000000000000000000006000022222222222600000000000005322222222222222222222222222222222222222222
-22222200000000000000000000000000000000000042222222222222222222222222222222222222222200000000000000000000000000000006000000000000
-00000000000000000222222222222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222
-22222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222
-22222222222220000000000000000000000000000000000052222222222222222222222222222225000000000000000000000000000000000000003222222222
-22222222222222222222222555555555555555555555555555555555532222222222222222222222223000000000000000000000000000000000000052222222
-22222222222222222222222260000000000000000000000000000000003222222222222222222222222222260000000000000000000000000000000000222222
-22222222222222222222222222222500000000000000000000000000000000060202222222222224000000000005222222222222222222222222222222222222
-22222222222222500000000000000000000000000000000000522222222222222222222222222222222222222224000000000000000000000000000000050000
-00000000000000000000000004222222222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222
-22222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222
-22222222222222222222400000000000000000000000000000000005222222222222222222222222222222226000000000000000000000000000000000000052
-22222222222222222222222222222225555555555555555555555555555555555322222222222222222222222230000000000000000000000000000000000000
-42222222222222222222222222222222600000000000000000000000000000000042222222222222222222222222222600000000000000000000000000000000
-00222222222222222222222222222222222225000000000000000000000000000000000600002222222222226000000005222222222222222222222222222222
-22222222222222222222223000000000000000000000000000000000000222222222222222222222222222222222222222260000000000000000000000000000
-00030000000000000000000000000000052222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222222
-22222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002
-22222222222222222222222222225000000000000000000000000000000000422222222222222222222222222222222240000000000000000000000000000000
-00000002222222222222222222222222222222355555555555555555555555555555555553222222222222222222222222500000000000000000000000000000
-00000000222222222222222222222222222222226000000000000000000000000000000000522222222222222222222222222226000000000000000000000000
-00000000002222222222222222222222222222222222250000000000000000000000000000000006020222222222222240000005322222222222222222222222
-22222222222222222222222222222226000000000000000000000000000000000003222222222222222222222222222222222222223000000000000000000000
-00000000006260000000000000000000000000000022222222222222222222222222222222222222222222222222226000000000000000000000000000000000
-32222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000
-00000002222222222222222222222222222200000000000000000000000000000000002222222222222222222222222222222222260000000000000000000000
-00000000000000042222222222222222222222222222223555555555555555555555555555555555552222222222222222222222225000000000000000000000
-00000000000000062222222222222222222222222222222260000000000000000000000000000000006222222222222222222222222222260000000000000000
-00000000000000000022222222222222222222222222222222222500000000000000000000000000000000060000222222222222260006322222222222222222
-22222222222222222222222222222222222222260000000000000000000000000000000000032222222222222222222222222222222222222250000000000000
-00000000000000000052500000000000000000000000000000422222222222222222222222222222222222222222222222222260000000000000000000000000
-00000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000
-00000000000000022222222222222222222222222223000000000000000000000000000000000022222222222222222222222222222222222400000000000000
-00000000000000000000000622222222222222222222222222222235555555555555555555555555555555555522222222222222222222222250000000000000
-00000000000000000000000522222222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222600000000
-00000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222222222222406322222222222
-22222222222222222222222222222222222222222222222500000000000000000000000000000000000422222222222222222222222222222222222222000000
-00000000000000000000000000425000000000000000000000000000006222222222222222222222222222222222222222222222222222600000000000000000
-00000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000
-00000000000000000000000222222222222222222222222222250000000000000000000000000000000000222222222222222222222222222222222222600000
-00000000000000000000000000000000322222222222222222222222222222355555555555555555555555555555555555222222222222222222222222500000
-00000000000000000000000000000005222222222222222222222222222222226000000000000000000000000000000000032222222222222222222222222226
-00000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006000022222222222222422222
-22222222222222222222222222222222222222222222222222222225000000000000000000000000000000000005222222222222222222222222222222222222
-24000000000000000000000000000000003230000000000000000000000000000003222222222222222222222222222222222222222222222222226000000000
-00000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600
-00000000000000000000000000000002222222222222222222222222222500000000000000000000000000000000002222222222222222222222222222222222
-22500000000000000000000000000000000000004222222222222222222222222222225555555555555555555555555555555555553222222222222222222222
-22500000000000000000000000000000000000052222222222222222222222222222222260000000000000000000000000000000000322222222222222222222
-22222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222222222
-22222222222222222222222222222222222222222222222222222222222222250000000000000000000000000000000000052222222222222222222222222222
-22222222250000000000000000000000000000000022200000000000000000000000000000042222222222222222222222222222222222222222222222222260
-00000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222
-22222600000000000000000000000000000000022222222222222222222222222226000000000000000000000000000000000022222222222222222222222222
-22222222223000000000000000000000000000000000000062222222222222222222222222222255555555555555555555555555555555555532222222222222
-22222222225000000000000000000000000000000000000422222222222222222222222222222222600000000000000000000000000000000003222222222222
-22222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000600002222
-22222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000000000000622222222222222222222
-22222222222222222000000000000000000000000000000005222600000000000000000000000000000622222222222222222222222222222222222222222222
-22222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222
-22222222222226000000000000000000000000000000000222222222222222222222222222200000000000000000000000000000000000222222222222222222
-22222222222222222226000000000000000000000000000000000000032222222222222222222222222222555555555555555555555555555555555555322222
-22222222222222222250000000000000000000000000000000000003222222222222222222222222222222225000000000000000000000000000000000032222
-22222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006
-02022222222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000006222222222222
-22222222222222222222222240000000000000000000000000000000042226000000000000000000000000000000322222222222222222222222222222222222
-22222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222
-22222222222222222222260000000000000000000000000000000002222222222222222222222222222000000000000000000000000000000000002222222222
-22222222222222222222222222250000000000000000000000000000000000000422222222222222222222222222225555555555555555555555555555555555
-55322222222222222222222222500000000000000000000000000000000000052222222222222222222222222222222250000000000000000000000000000000
-00032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000
-00000006000022222222222222222222222222222222222222222222222222222222222222222222222222200000000000000000000000000000000000062222
-22222222222222222222222222222222500000000000000000000000000000000322250000000000000000000000000000005222222222222222222222222222
-22222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222
-22222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022
-22222222222222222222222222222222222400000000000000000000000000000000000005222222222222222222222222222355555555555555555555555555
-55555555555222222222222222222222225000000000000000000000000000000000000522222222222222222222222222222222500000000000000000000000
-00000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000
-00000000000000060202222222222222222222222222222222222222222222222222222222222222222222222222224000000000000000000000000000000000
-00062222222222222222222222222222222222220000000000000000000000000000000002222400000000000000000000000000000002222222222222222222
-22222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000
-00062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000
-00000022222222222222222222222222222222222223000000000000000000000000000000000000002222222222222222222222222223555555555555555555
-55555555555555555552222222222222222222222240000000000000000000000000000000000005222222222222222222222222222222225000000000000000
-00000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000
-00000000000000000000000600042222222222222222222222222222222222222222222222222222222222222222222222222260000000000000000000000000
-00000000000622222222222222222222222222222222222400000000000000000000000000000000522223000000000000000000000000000000042222222222
-22222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000
-00000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000
-00000000000000222222222222222222222222222222222222220000000000000000000000000000000000000032222222222222222222222222235555555555
-55555555555555555555555555522222222222222222222222300000000000000000000000000000000000052222222222222222222222222222222250000000
-00000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500
-00000000000000000000000000000006020222222222222222222222222222222222222222222222222222222222222222222222222224000000000000000000
-00000000000000000006222222222222222222222222222222222225000000000000000000000000000000004222220000000000000000000000000000000522
-22222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000
-00000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000
-00000000000000000000002222222222222222222222222222222222222260000000000000000000000000000000000000422222222222222222222222222355
-55555555555555555555555555555555555222222222222222222222223000000000000000000000000000000000000622222222222222222222222222222222
-50000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222
-22222500000000000000000000000000000000060202222222222222222222222222222222222222222222222222222222222222222222222222300000000000
-00000000000000000000000000062222222222222222222222222222222222200000000000000000000000000000000032222260000000000000000000000000
-00000022222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000
-00000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000
-00000000000000000000000000000022222222222222222222222222222222222222500000000000000000000000000000000000005222222222222222222222
-22222355555555555555555555555555555555555552222222222222222222222220000000000000000000000000000000000000222222222222222222222222
-22222222500000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222
-22222222222225000000000000000000000000000000000602022222222222222222222222222222222222222222222222222222222222222222222222226000
-00000000000000000000000000000000000622222222222222222222222222222222224000000000000000000000000000000000222222500000000000000000
-00000000000000422222222222222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222
-22300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222
-22300000000000000000000000000000000000222222222222222222222222222222222222224000000000000000000000000000000000000062222222222222
-22222222222225555555555555555555555555555555555555522222222222222222222222200000000000000000000000000000000000003222222222222222
-22222222222222225000000000000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222
-22222222222222222222250000000000000000000000000000000006020222222222222222222222222222222222222222222222222222222222222222222222
-22300000000000000000000000000000000000000005222222222222222222222222222222222250000000000000000000000000000000052222224000000000
-00000000000000000000005222222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222
-22222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222
-22222222223000000000000000000000000000000000002222222222222222222222222222222222222230000000000000000000000000000000000000022222
-22222222222222222222255555555555555555555555555555555555555322222222222222222222222600000000000000000000000000000000000052222222
-22222222222222222222222250000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222
-22222222222222222222222222222500000000000000000000000000000000060202222222222222222222222222222222222222222222222222222222222222
-22222222240000000000000000000000000000000000000000052222222222222222222222222222222222000000000000000000000000000000000422222230
-00000000000000000000000000000002222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222
-22222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222
-22222222222222222230000000000000000000000000000000000022222222222222222222222222222222222222300000000000000000000000000000000000
-00032222222222222222222222222555555555555555555555555555555555555553222222222222222222222225000000000000000000000000000000000000
-62222222222222222222222222222222500000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000
-00222222222222222222222222222222222225000000000000000000000000000000000602022222222222222222222222222222222222222222222222222222
-22222222222222236000000000000000000000000000000000000000000422222222222222222222222222222222240000000000000000000000000000000003
-22222220000000000000000000000000000000042222222222222222222222222222222222222222222222600000000000000000000000000000000032222222
-22222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002
-22222222222222222222222222300000000000000000000000000000000000222222222222222222222222222222222222222000000000000000000000000000
-00000000000522222222222222222222222225555555555555555555555555555555555555532222222222222222222222240000000000000000000000000000
-00000000042222222222222222222222222222225000000000000000000000000000000000032222222222222222222222222226000000000000000000000000
-00000000002222222222222222222222222222222222250000000000000000000000000000000006020222222222222222222222222222222222222222222222
-22222222222222222222246000000000000000000000000000000000000000000003222222222222222222222222222222222500000000000000000000000000
-00000062222222250000000000000000000000000000000622222222222222222222222222222222222222222222226000000000000000000000000000000000
-32222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000
-00000002222222222222222222222222223000000000000000000000000000000000002222222222222222222222222222222222222220000000000000000000
-00000000000000000005222222222222222222222222255555555555555555555555555555555555555322222222222222222222222300000000000000000000
-00000000000000000622222222222222222222222222222250000000000000000000000000000000000322222222222222222222222222260000000000000000
-00000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222222222222222222222222222222222
-22222222222222222222222222450000000000000000000000000000000000000000000000022222222222222222222222222222222220000000000000000000
-00000000000000522222222400000000000000000000000000000000322222222222222222222222222222222222222222222260000000000000000000000000
-00000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000
-00000000000000022222222222222222222222222230000000000000000000000000000000000022222222222222222222222222222222222222260000000000
-00000000000000000000000000062222222222222222222222222555555555555555555555555555555555555553222222222222222222222222000000000000
-00000000000000000000000000522222222222222222222222222222500000000000000000000000000000000003222222222222222222222222222600000000
-00000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222222222222222222222222222
-22222222222222222222222222222234500000000000000000000000000000000000000000000000006222222222222222222222222222222222400000000000
-00000000000000000000004222222223000000000000000000000000000000005222222222222222222222222222222222222222222222600000000000000000
-00000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000
-00000000000000000000000222222222222222222222222222300000000000000000000000000000000000222222222222222222222222222222222222222600
-00000000000000000000000000000000000022222222222222222222222235555555555555555555555555555555555555532222222222222222222222225000
-00000000000000000000000000000000000422222222222222222222222222225000000000000000000000000000000000032222222222222222222222222226
-00000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006020222222222222222222222
-22222222222222222222222222222222234560000000000000000000000000000000000000000000000000000052222222222222222222222222222222225000
-00000000000000000000000000000032222222220000000000000000000000000000000062222222222222222222222222222222222222222222226000000000
-00000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600
-00000000000000000000000000000002222222222222222222222222223000000000000000000000000000000000002222222222222222222222222222222222
-22222600000000000000000000000000000000000000222222222222222222222222355555555555555555555555555555555555555522222222222222222222
-22224000000000000000000000000000000000000000522222222222222222222222222250000000000000000000000000000000000322222222222222222222
-22222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222222222
-22222222222222222222222222222222222234560000000000000000000000000000000000000000000000000000000000322222222222222222222222222222
-22220000000000000000000000000000000006222222222260000000000000000000000000000000032222222222222222222222222222222222222222222260
-00000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222
-22222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022222222222222222222222222
-22222222222226000000000000000000000000000000000000003222222222222222222222223555555555555555555555555555555555555555222222222222
-22222222222220000000000000000000000000000000000000000632222222222222222222222222400000000000000000000000000000000003222222222222
-22222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222
-22222222222222222222222222222222222222345660000000000000000000000000000000000000000000000000000000000000002222222222222222222222
-22222222222400000000000000000000000000000000052222222222500000000000000000000000000000000522222222222222222222222222222222222222
-22222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222
-22222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000000000222222222222222222
-22222222222222222222250000000000000000000000000000000000000032222222222222222222222235555555555555555555555555555555555555552222
-22222222222222222222250000000000000000000000000000000000000000053222222222222222222222223000000000000000000000000000000000032222
-22222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006
-02022222222222222222222222222222222222222345600000000000000000000000000000000000000000000000000000000000000000000522222222222222
-22222222222222222225000000000000000000000000000000000422222222223000000000000000000000000000000000222222222222222222222222222222
-22222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222
-22222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000000000000000002222222222
-22222222222222222222222222222500000000000000000000000000000000000000522222222222222222222222355555555555555555555555555555555555
-55552222222222222222222222222300000000000000000000000000000000000000000005422222222222222222222230000000000000000000000000000000
-00032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000
-00000006020222222222222222222222222222222222224500000000000000000000000000000000000000000000000000000000000000000000000003222222
-22222222222222222222222222200000000000000000000000000000000002222222222220000000000000000000000000000000004222222222222222222222
-22222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222
-22222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022
-22222222222222222222222222222222222225000000000000000000000000000000000000005222222222222222222222223555555555555555555555555555
-55555555555522222222222222222222222222600000000000000000000000000000000000000000000055322222222222222222300000000000000000000000
-00000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000
-00000000000000060202222222222222222222222222222222235000000000000000000000000000000000000000000000000000000000000000000000000000
-62222222222222222222222222222222224000000000000000000000000000000000522222222222250000000000000000000000000000000052222222222222
-22222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000
-00062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000
-00000022222222222222222222222222222222222222250000000000000000000000000000000000000052222222222222222222222235555555555555555555
-55555555555555555555222222222222222222222222224000000000000000000000000000000000000000000000000006555333322222223000000000000000
-00000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000
-00000000000000000000000602022222222222222222222222222222236000000000000000000000000000000000000000000000000000000000000000000000
-00000000422222222222222222222222222222222250000000000000000000000000000000004222222222222400000000000000000000000000000000022222
-22222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000
-00000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000
-00000000000000222222222222222222222222222222222222222500000000000000000000000000000000000000622222222222222222222222355555555555
-55555555555555555555555555552222222222222222222222222226000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500
-00000000000000000000000000000006030522222222222222222222222222246000000000000000000000000000000000000000000000000000000000000000
-00000000000000062222222222222222222222222222222222000000000000000000000000000000000032222222222223000000000000000000000000000000
-00042222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000
-00000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000
-00000000000000000000002222222222222222222222222222222222222225000000000000000000000000000000000000006222222222222222222222223555
-55555555555555555555555555555555555522222222222222222222222222230000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222
-22222500000000000000000000000000000000060202222222222222222222222222236000000000000000000000000000000000000000000000000000000000
-00000000000000000000000322222222222222222222222222222222240000000000000000000000000000000006222222222222226000000000000000000000
-00000000000522222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000
-00000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000
-00000000000000000000000000000022222222222222222222222222222222222222250000000000000000000000000000000000000062222222222222222222
-22223555555555555555555555555555555555555555222222222222222222222222222250000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222
-22222222222225000000000000000000000000000000000600002222222222222222222222225000000000000000000000000000000000000000000000000000
-00000000000000000000000000000052222222222222222222222222222222222500000000000000000000000000000000052222222222222250000000000000
-00000000000000000000322222222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222
-22300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222
-22300000000000000000000000000000000000222222222222222222222222222222222222222500000000000000000000000000000000000000022222222222
-22222222222235555555555555555555555555555555555555552222222222222222222222222222300000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222
-22222222222222222222250000000000000000000000000000000006020222222222222222222222224000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000222222222222222222222222222222222220000000000000000000000000000000000322222222222222400000
-00000000000000000000000000004222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222
-22222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222
-22222222223000000000000000000000000000000000002222222222222222222222222222222222222225000000000000000000000000000000000000000222
-22222222222222222222355555555555555555555555555555555555555522222222222222222222222222222400000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222
-22222222222222222222222222222500000000000000000000000000000000060000222222222222222222222500000000000000000000000000000000000000
-00000000000000000000000000000000000000000000032222222222222222222222222222222222400000000000000000000000000000000002222222222222
-22200000000000000000000000000000000062222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222
-22222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222
-22222222222222222230000000000000000000000000000000000022222222222222222222222222222222222222250000000000000000000000000000000000
-00000222222222222222222222223555555555555555555555555555555555555555222222222222222222222222222222500000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000
-00222222222222222222222222222222222225000000000000000000000000000000000602022222222222222222222300000000000000000000000000000000
-00000000000000000000000000000000000000000000000000005222222222222222222222222222222222226000000000000000000000000000000000522222
-22222222222500000000000000000000000000000000032222222222222222222222222222222222222222600000000000000000000000000000000032222222
-22222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002
-22222222222222222222222222300000000000000000000000000000000000222222222222222222222222222222222222222400000000000000000000000000
-00000000000002222222222222222222222235555555555555555555555555555555555555552222222222222222222222222222222600000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000032222222222222222222222222226000000000000000000000000
-00000000002222222222222222222222222222222222250000000000000000000000000000000006000022222222222222222240000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000522222222222222222222222222222222222300000000000000000000000000000000
-00422222222222222224000000000000000000000000000000000522222222222222222222222222222222222222226000000000000000000000000000000000
-32222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000
-00000002222222222222222222222222223000000000000000000000000000000000002222222222222222222222222222222222222223000000000000000000
-00000000000000000000022222222222222222222222355555555555555555555555555555555555555522222222222222222222222222222222600000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000322222222222222222222222222260000000000000000
-00000000000000000022222222222222222222222222222222222500000000000000000000000000000000060202222222222222222224000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222224000000000000000000000000
-00000000002222222222222222220000000000000000000000000000000006222222222222222222222222222222222222222260000000000000000000000000
-00000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000
-00000000000000022222222222222222222222222230000000000000000000000000000000000022222222222222222222222222222222222222230000000000
-00000000000000000000000000000222222222222222222222223555555555555555555555555555555555555555222222222222222222222222222222223000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003222222222222222222222222222600000000
-00000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000600002222222222222222500000000000
-00000000000000000000000000000000000000000000000000000000000000000000000006222222222222222222222222222222222222260000000000000000
-00000000000000000522222222222222222260000000000000000000000000000000003222222222222222222222222222222222222222600000000000000000
-00000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000
-00000000000000000000000222222222222222222222222222300000000000000000000000000000000000222222222222222222222222222222222222222300
-00000000000000000000000000000000000002222222222222222222222235555555555555555555555555555555555555552222222222222222222222222222
-22222300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032222222222222222222222222226
-00000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006020222222222222222240000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000622222222222222222222222222222222222223000000000
-00000000000000000000000004222222222222222222400000000000000000000000000000000052222222222222222222222222222222222222226000000000
-00000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600
-00000000000000000000000000000002222222222222222222222222223000000000000000000000000000000000002222222222222222222222222222222222
-22222300000000000000000000000000000000000000022222222222222222222222355555555555555555555555555555555555555522222222222222222222
-22222222222222260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000322222222222222222222
-22222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000000000060000222222222222
-22300000000000000000000000000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222222222222240
-00000000000000000000000000000000032222222222222222223000000000000000000000000000000000022222222222222222222222222222222222222260
-00000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222
-22222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022222222222222222222222222
-22222222222223000000000000000000000000000000000000000222222222222222222222223555555555555555555555555555555555555555222222222222
-22222222222222222222222250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003222222222222
-22222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000602022222
-22222222226000000000000000000000000000000000000000000000000000000000000000000000000000000000005222222222222222222222222222222222
-22222260000000000000000000000000000000006222222222222222222226000000000000000000000000000000000422222222222222222222222222222222
-22222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222
-22222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000000000222222222222222222
-22222222222222222222240000000000000000000000000000000000000002222222222222222222222235555555555555555555555555555555555555552222
-22222222222222222222222222222222240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032222
-22222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006
-00002222222222222500000000000000000000000000000000000000000000000000000000000000000000000000000000000422222222222222222222222222
-22222222222223000000000000000000000000000000000052222222222222222222240000000000000000000000000000000005222222222222222222222222
-22222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222
-22222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000000000000000002222222222
-22222222222222222222222222222500000000000000000000000000000000000000022222222222222222222222355555555555555555555555555555555555
-55552222222222222222222222222222222222222236000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000
-00000006020222222222222230000000000000000000000000000000000000000000000000000000000000000000000000000000000532222222222222222222
-22222222222222222222240000000000000000000000000000000000322222222222222222222300000000000000000000000000000000002222222222222222
-22222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222
-22222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022
-22222222222222222222222222222222222225000000000000000000000000000000000000000222222222222222222222223555555555555555555555555555
-55555555555522222222222222222222222222222222222222225000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000
-00000000000000060000222222222222500000000000000000000000000000000000000000000000000000000000000000000000000000000632222222222222
-22222222222222222222222222222600000000000000000000000000000000002222222222222222222222600000000000000000000000000000000042222222
-22222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000
-00062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000
-00000022222222222222222222222222222222222222250000000000000000000000000000000000000002222222222222222222222235555555555555555555
-55555555555555555555222222222222222222222222222222222222222223500000000000000000000000000000000000000000000000000000000000000000
-00000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000
-00000000000000000000000602022222222222230000000000000000000000000000000000000000000000000000000000000000000000000000000642222222
-22222222222222222222222222222222222230000000000000000000000000000000000522222222222222222222225000000000000000000000000000000000
-62222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222223000000000000000000000
-00000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000
-00000000000000222222222222222222222222222222222222222500000000000000000000000000000000000000022222222222222222222222355555555555
-55555555555555555555555555552222222222222222222222222222222222222222222350000000000000000000000000000000000000000000000000000000
-00000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500
-00000000000000000000000000000006000022222222222500000000000000000000000000000000000000000000000000000000000000000000000000000532
-22222222222222222222222222222222222222222222400000000000000000000000000000000004222222222222222222222230000000000000000000000000
-00000000032222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222222222222230000000000000
-00000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000
-00000000000000000000002222222222222222222222222222222222222225000000000000000000000000000000000000006222222222222222222222223555
-55555555555555555555555555555555555522222222222222222222222222222222222222222222235000000000000000000000000000000000000000000000
-00000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222
-22222500000000000000000000000000000000060600222222222220000000000000000000000000000000000000000000000000000000000000000000000000
-00653222222222222222222222222222222222222222222222226000000000000000000000000000000000022222222222222222222222260000000000000000
-00000000000000000422222222222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222300000
-00000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000
-00000000000000000000000000000022222222222222222222222222222222222222250000000000000000000000000000000000000062222222222222222222
-22223555555555555555555555555555555555555555222222222222222222222222222222222222222222222222460000000000000000000000000000000000
-00000000000000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222
-22222222222225000000000000000000000000000000000600002222222222400000000000000000000000000000000000000000000000000000000000000000
-00000006532222222222222222222222222222222222222222222222222300000000000000000000000000000000006222222222222222222222222500000000
-00000000000000000000000006222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222
-22300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222
-22300000000000000000000000000000000000222222222222222222222222222222222222222500000000000000000000000000000000000000622222222222
-22222222222235555555555555555555555555555555555555552222222222222222222222222222222222222222222222222235600000000000000000000000
-00000000000000000000000000000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222
-22222222222222222222250000000000000000000000000000000006000022222222226000000000000000000000000000000000000000000000000000000000
-00000000000054322222222222222222222222222222222222222222222222222224000000000000000000000000000000000042222222222222222222222224
-00000000000000000000000000000000003222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222222
-22222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000000000022222222222222222
-22222222223000000000000000000000000000000000002222222222222222222222222222222222222225000000000000000000000000000000000000006222
-22222222222222222222355555555555555555555555555555555555555522222222222222222222222222222222222222222222222222222345000000000000
-00000000000000000000000000000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222
-22222222222222222222222222222500000000000000000000000000000000060000222222222300000000000000000000000000000000000000000000000000
-00000000000000006532222222222222222222222222222222222222222222222222222222260000000000000000000000000000000000322222222222222222
-22222222000000000000000000000000000000000052222222222222222222222222222222222260000000000000000000000000000000003222222222222222
-22222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000000000000000000222222222
-22222222222222222230000000000000000000000000000000000022222222222222222222222222222222222222250000000000000000000000000000000000
-00005222222222222222222222223555555555555555555555555555555555555555222222222222222222222222222222222222222222222222222222222345
-60000000000000000000000000000000000000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000
-00222222222222222222222222222222222225000000000000000000000000000000000600002222222224000000000000000000000000000000000000000000
-00000000000000000000654222222222222222222222222222222222222222222222222222222222223000000000000000000000000000000000062222222222
-22222222222222225000000000000000000000000000000000622222222222222222222222222222222222600000000000000000000000000000000032222222
-22222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000000000000000000000000002
-22222222222222222222222222300000000000000000000000000000000000222222222222222222222222222222222222222500000000000000000000000000
-00000000000052222222222222222222222235555555555555555555555555555555555555532222222222222222222222222222222222222222222222222222
-22222222223456600000000000000000000000000000000000000000000000000000000000032222222222222222222222222226000000000000000000000000
-00000000002222222222222222222222222222222222250000000000000000000000000000000006000022222222250000000000000000000000000000000000
-00000000000000000000000065422222222222222222222222222222222222222222222222222222222222222240000000000000000000000000000000000522
-22222222222222222222222240000000000000000000000000000000000322222222222222222222222222222222226000000000000000000000000000000000
-32222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600000000000000000000000000
-00000002222222222222222222222222223000000000000000000000000000000000002222222222222222222222222222222222222226000000000000000000
-00000000000000000000422222222222222222222222255555555555555555555555555555555555555322222222222222222222222222222222222222222222
-22222222222222222222222233455566660000000000000060000000000000000000000000000000000322222222222222222222222222260000000000000000
-00000000000000000022222222222222222222222222222222222500000000000000000000000000000000060000222222222000000000000000000000000000
-00000000000000000000000000006542222222222222222222222222222222222222222222222222222222222222222222600000000000000000000000000000
-00000322222222222222222222222222200000000000000000000000000000000005222222222222222222222222222222222260000000000000000000000000
-00000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222222226000000000000000000
-00000000000000022222222222222222222222222230000000000000000000000000000000000022222222222222222222222222222222222222260000000000
-00000000000000000000000000003222222222222222222222222555555555555555555555555555555555555553222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222600000000
-00000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000600002222222230000000000000000000
-00000000000000000000000000000000654322222222222222222222222222222222222222222222222222222222222222222222230000000000000000000000
-00000000000002222222222222222222222222222500000000000000000000000000000000002222222222222222222222222222222222600000000000000000
-00000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222222222222222260000000000
-00000000000000000000000222222222222222222222222222300000000000000000000000000000000000222222222222222222222222222222222222222600
-00000000000000000000000000000000000022222222222222222222222225555555555555555555555555555555555555532222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222226
-00000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006000022222222400000000000
-00000000000000000000000000000000000006432222222222222222222222222222222222222222222222222222222222222222222222222400000000000000
-00000000000000000000522222222222222222222222222224000000000000000000000000000000000042222222222222222222222222222222226000000000
-00000000000000000000000032222222222222222222222222222222223000000000000000000000000000000006222222222222222222222222222222222600
-00000000000000000000000000000002222222222222222222222222223000000000000000000000000000000000002222222222222222222222222222222222
-22222000000000000000000000000000000000000000222222222222222222222222255555555555555555555555555555555555555322222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000322222222222222222222
-22222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000000000060000222222225000
-00000000000000000000000000000000000000000065322222222222222222222222222222222222222222222222222222222222222222222222222226000000
-00000000000000000000000000004222222222222222222222222222220000000000000000000000000000000000522222222222222222222222222222222260
-00000000000000000000000000000000322222222222222222222222222222222230000000000000000000000000000000062222222222222222222222222222
-22222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022222222222222222222222222
-22222222222230000000000000000000000000000000000000062222222222222222222222222555555555555555555555555555555555555553222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222260000000000000000000000000000000003222222222222
-22222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000000000000000000600002222
-22225000000000000000000000000000000000000000000064222222222222222222222222222222222222222222222222222222222222222222222222222222
-30000000000000000000000000000000000022222222222222222222222222222250000000000000000000000000000000000222222222222222222222222222
-22222260000000000000000000000000000000003222222222222222222222222222222222300000000000000000000000000000000622222222222222222222
-22222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000000000222222222222222222
-22222222222222222222300000000000000000000000000000000000000522222222222222222222222225555555555555555555555555555555555555532222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222600000000000000000000000000000000032222
-22222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222250000000000000000000000000000000006
-00002222222260000000000000000000000000000000000000000004222222222222222222222222222222222222222222222222222222222222222222222222
-22222222400000000000000000000000000000000006222222222222222222222222222222400000000000000000000000000000000004222222222222222222
-22222222222222600000000000000000000000000000000032222222222222222222222222222222224000000000000000000000000000000006222222222222
-22222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000000000000000002222222222
-22222222222222222222222222225000000000000000000000000000000000000005222222222222222222222222255555555555555555555555555555555555
-55522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000
-00032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222500000000000000000000000000
-00000006000022222222000000000000000000000000000000000000000006222222222222222222222222222222222222222222222222222222222222222222
-22222222222222226000000000000000000000000000000000042222222222222222222222222222223000000000000000000000000000000000062222222222
-22222222222222222222226000000000000000000000000000000000322222222222222222222222222222222250000000000000000000000000000000062222
-22222222222222222222222222222600000000000000000000000000000000022222222222222222222222222230000000000000000000000000000000000022
-22222222222222222222222222222222222250000000000000000000000000000000000000032222222222222222222222222355555555555555555555555555
-55555555555222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222260000000000000000000000
-00000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222222225000000000000000000
-00000000000000060000222222220000000000000000000000000000000000000000522222222222222222222222222222222222222222222222222222222222
-22222222222222222222222300000000000000000000000000000000000322222222222222222222222222222226000000000000000000000000000000000032
-22222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222500000000000000000000000000000
-00062222222222222222222222222222222226000000000000000000000000000000000222222222222222222222222222300000000000000000000000000000
-00000022222222222222222222222222222222222222600000000000000000000000000000000000000222222222222222222222222223555555555555555555
-55555555555555555552222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222600000000000000
-00000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222222222222222260000000000
-00000000000000000000000600002222222200000000000000000000000000000000000000062222222222222222222222222222222222222222222222222222
-22222222222222222222222222222225000000000000000000000000000000000062222222222222222222222222222222240000000000000000000000000000
-00000042222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222225000000000000000000000
-00000000000622222222222222222222222222222222260000000000000000000000000000000002222222222222222222222222223000000000000000000000
-00000000000000222222222222222222222222222222222222220000000000000000000000000000000000000062222222222222222222222222235555555555
-55555555555555555555555555522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226000000
-00000000000000000000000000032222222222222222222222222226000000000000000000000000000000000022222222222222222222222222222222222600
-00000000000000000000000000000006000022222222000000000000000000000000000000000000000322222222222222222222222222222222222222222222
-22222222222222222222222222222222222222260000000000000000000000000000000000522222222222222222222222222222222300000000000000000000
-00000000000000622222222222222222222222222222226000000000000000000000000000000000322222222222222222222222222222222250000000000000
-00000000000000000006222222222222222222222222222222222000000000000000000000000000000000022222222222222222222222222230000000000000
-00000000000000000000002222222222222222222222222222222222222400000000000000000000000000000000000000522222222222222222222222222355
-55555555555555555555555555555555555222222222222222222222222222222222222222233222222222222222222222222222222222222222222222222222
-20000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000222222222222222222222222222222
-22222600000000000000000000000000000000060000222222220000000000000000000000000000000000000052222222222222222222222222222222222222
-22222222222222222222222222222222222222222222223000000000000000000000000000000000004222222222222222222222222222222222600000000000
-00000000000000000000000322222222222222222222222222222260000000000000000000000000000000003222222222222222222222222222222222500000
-00000000000000000000000000062222222222222222222222222222222220000000000000000000000000000000000222222222222222222222222222300000
-00000000000000000000000000000022222222222222222222222222222222222225000000000000000000000000000000000000004222222222222222222222
-22222355555555555555555555555555555555555552222222222222222222222222222222222222222505222222222222222222222222222222222222222222
-22222222200000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000002222222222222222222222
-22222222222226000000000000000000000000000000000600002222222200000000000000000000000000000000000000322222222222222222222222222222
-22222222222222222222222222222222222222222222222222222250000000000000000000000000000000000022222222222222222222222222222222225000
-00000000000000000000000000000005222222222222222222222222222222600000000000000000000000000000000032222222222222222222222222222222
-22500000000000000000000000000000000622222222222222222222222222222222200000000000000000000000000000000002222222222222222222222222
-22300000000000000000000000000000000000222222222222222222222222222222222222200000000000000000000000000000000000000032222222222222
-22222222222222555555555555555555555555555555555555322222222222222222222222222222222222222230006322222222222222222222222222222222
-22222222222222222000000000000000000000000000000000032222222222222222222222222226000000000000000000000000000000000042222222222222
-22222222222222222222200000000000000000000000000000000006020222222222000000000000000000000000000000000000002222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222600000000000000000000000000000000005222222222222222222222222222222
-22223000000000000000000000000000000000062222222222222222222222222222226000000000000000000000000000000000322222222222222222222222
-22222222226000000000000000000000000000000006222222222222222222222222222222222000000000000000000000000000000000022222222222222222
-22222222223000000000000000000000000000000000002222222222222222222222222222222222224000000000000000000000000000000000000000222222
-22222222222222222222225555555555555555555555555555555555553222222222222222222222222222222222222222600000522222222222222222222222
-22222222222222222222222230000000000000000000000000000000000322222222222222222222222222260000000000000000000000000000000000052222
-22222222222222222222222222222000000000000000000000000000000000060000222222220000000000000000000000000000000000000622222222222222
-22222222222222222222222222222222222222222222222222222222222222222222230000000000000000000000000000000000042222222222222222222222
-22222222222226000000000000000000000000000000000042222222222222222222222222222260000000000000000000000000000000003222222222222222
-22222222222222222260000000000000000000000000000000005222222222222222222222222222222230000000000000000000000000000000000222222222
-22222222222222222230000000000000000000000000000000000022222222222222222222222222222222222260000000000000000000000000000000000000
-05222222222222222222222222222255555555555555555555555555555555555532222222222222222222222222222222222222250000000042222222222222
-22222222222222222222222222222222400000000000000000000000000000000003222222222222222222222222222600000000000000000000000000000000
-00005222222222222222222222222222222230000000000000000000000000000000000602022222222200000000000000000000000000000000000006222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000000000000222222222222222
-22222222222222222222250000000000000000000000000000000000522222222222222222222222222222600000000000000000000000000000000062222222
-22222222222222222222222222000000000000000000000000000000000005222222222222222222222222222222300000000000000000000000000000000002
-22222222222222222222222222300000000000000000000000000000000000422222222222222222222222222222222224000000000000000000000000000000
-00000000042222222222222222222222222222555555555555555555555555555555555555222222222222222222222222222222222222223000000000063222
-22222222222222222222222222222222222222225000000000000000000000000000000000032222222222222222222222222226000000000000000000000000
-00000000000006322222222222222222222222222222400000000000000000000000000000000006000022222222600000000000000000000000000000000000
-06222222222222222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000000000000000062222222
-22222222222222222222222222222400000000000000000000000000000000000222222222222222222222222222226000000000000000000000000000000000
-06322222222222222222222222222222230000000000000000000000000000000000006322222222222222222222222222224000000000000000000000000000
-00000002222222222222222222222222223000000000000000000000000000000000000422222222222222222222222222222222260000000000000000000000
-00000000000000000222222222222222222222222222223555555555555555555555555555555555552222222222222222222222222222222222222250000000
-00000532222222222222222222222222222222222222222260000000000000000000000000000000000322222222222222222222222222260000000000000000
-00000000000000000000000422222222222222222222222222225000000000000000000000000000000000060202222222226000000000000000000000000000
-00000000002222222222222222222222222222222222222222222222222222222222222222222222222222222222300000000000000000000000000000000000
-42222222222222222222222222222222222222000000000000000000000000000000000004222222222222222222222222222260000000000000000000000000
-00000000000422222222222222222222222222222400000000000000000000000000000000000000422222222222222222222222222250000000000000000000
-00000000000000022222222222222222222222222230000000000000000000000000000000000000422222222222222222222222222222225000000000000000
-00000000000000000000000052222222222222222222222222222235555555555555555555555555555555555522222222222222222222222222222222222223
-00000000000000053222222222222222222222222222222222222222000000000000000000000000000000000003222222222222222222222222222600000000
-00000000000000000000000000000000522222222222222222222222222260000000000000000000000000000000000602022222222250000000000000000000
-00000000000000000032222222222222222222222222222222222222222222222222222222222222222222222222222222225000000000000000000000000000
-00000000322222222222222222222222222222222222225000000000000000000000000000000000052222222222222222222222222222600000000000000000
-00000000000000000000522222222222222222222222222225000000000000000000000000000000000000000522222222222222222222222222600000000000
-00000000000000000000006222222222222222222222222222300000000000000000000000000000000000000422222222222222222222222222222300000000
-00000000000000000000000000000000422222222222222222222222222222355555555555555555555555555555555555222222222222222222222222222222
-22222226000000000000000005222222222222222222222222222222222222240000000000000000000000000000000000032222222222222222222222222226
-00000000000000000000000000000000000000000042222222222222222222222223000000000000000000000000000000000006020222222222500000000000
-00000000000000000000000000422222222222222222222222222222222222222222222224642222222222222222222222222222222260000000000000000000
-00000000000000062222222222222222222222222222222222222240000000000000000000000000000000000022222222222222222222222222226000000000
-00000000000000000000000000000042222222222222222222222222200000000000000000000000000000000000000000042222222222222222222222220000
-00000000000000000000000000000062222222222222222222222222223000000000000000000000000000000000000000522222222222222222222222222220
-00000000000000000000000000000000000000002222222222222222222222222222222555555555555555555555555555555555532222222222222222222222
-22222222222222500000000000000000000532222222222222222222222222222222222600000000000000000000000000000000000322222222222222222222
-22222226000000000000000000000000000000000000000000063222222222222222222222260000000000000000000000000000000000060202222222223000
-00000000000000000000000000000000006222222222222222222222222222222222222222222225000622222222222222222222222222222223000000000000
-00000000000000000000000522222222222222222222222222222222222222200000000000000000000000000000000000422222222222222222222222222260
-00000000000000000000000000000000000000063222222222222222222222224000000000000000000000000000000000000000000063222222222222222222
-22240000000000000000000000000000000000622222222222222222222222222230000000000000000000000000000000000000000522222222222222222222
-22222260000000000000000000000000000000000000000522222222222222222222222222222225555555555555555555555555555555555322222222222222
-22222222222222222222230000000000000000000000053222222222222222222222222222222240000000000000000000000000000000000002222222222222
-22222222222222200000000000000000000000000000000000000000000005322222222222222222224000000000000000000000000000000000000502022222
-22222000000000000000000000000000000000000004222222222222222222222222222222222222222225000000422222222222222222222222222222250000
-00000000000000000000000000000004222222222222222222222222222222222222222500000000000000000000000000000000006222222222222222222222
-22222200000000000000000000000000000000000000000005322222222222222222222200000000000000000000000000000000000000000000006322222222
-22222222222000000000000000000000000000000000006222222222222222222222222222300000000000000000000000000000000000000000632222222222
-22222222222236000000000000000000000000000000000000000004222222222222222222222222222222255555555555555555555555555555555553222222
-22222222222222222222222222222500000000000000000000000006422222222222222222222222222223000000000000000000000000000000000000022222
-22222222222222222222222000000000000000000000000000000000000000000000000532222222222222222300000000000000000000000000000000000005
-02022222222226000000000000000000000000000000000000003222222222222222222222222222222222222235000000006222222222222222222222222222
-22260000000000000000000000000000000000022222222222222222222222222222222222222224000000000000000000000000000000000003222222222222
-22222222222222000000000000000000000000000000000000000000000532222222222222222226000000000000000000000000000000000000000000000000
-64222222222222222250000000000000000000000000000000000062222222222222222222222222223000000000000000000000000000000000000000000052
-22222222222222222224000000000000000000000000000000000000000000622222222222222222222222222222222555555555555555555555555555555555
-52222222222222222222222222222222222230000000000000000000000000000054222222222222222222222222300000000000000000000000000000000000
-00022222222222222222222222222220000000000000000000000000000000000000000000000000064322222222222240000000000000000000000000000000
-00000005020222222222250000000000000000000000000000000000000062222222222222222222222222222222222246000000000004222222222222222222
-22222222223000000000000000000000000000000000005222222222222222222222222222222222222222220000000000000000000000000000000000052222
-22222222222222222222220000000000000000000000000000000000000000000000064322222222222223600000000000000000000000000000000000000000
-00000000006532222222222236000000000000000000000000000000000000522222222222222222222222222230000000000000000000000000000000000000
-00000000532222222222222223600000000000000000000000000000000000000000005222222222222222222222222222222223555555555555555555555555
-55555555522222222222222222222222222222222222600000000000000000000000000000000543222222222222222222250000000000000000000000000000
-00000000006222222222222222222222222222200000000000000000000000000000000000000000000000000000654322222356000000000000000000000000
-00000000000000040202222222222300000000000000000000000000000000000000063222222222222222222222222222222350000000000000062222222222
-22222222222222222250000000000000000000000000000000000042222222222222222222222222222222222222222250000000000000000000000000000000
-00062222222222222222222222222200000000000000000000000000000000000000000000000000654322222234500000000000000000000000000000000000
-00000000000000000000005533333456000000000000000000000000000000000000005222222222222222222222222222300000000000000000000000000000
-00000000000000000054322222222234600000000000000000000000000000000000000000000022222222222222222222222222222222235555555555555555
-55555555555555555222222222222222222222222222222222240000000000000000000000000000000000006543222222222222450000000000000000000000
-00000000000000000052222222222222222222222222223000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000302022222222222000000000000000000000000000000000000000004222222222222222222222222223560000000000000000032
-22222222222222222222222222600000000000000000000000000000000000322222222222222222222222222222222222222222400000000000000000000000
-00000000000032222222222222222222222222000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000042222222222222222222222222223000000000000000000000
-00000000000000000000000000000665555560000000000000000000000000000000000000000000000005222222222222222222222222222222222255555555
-55555555555555555555555532222222222222222222222222222222222000000000000000000000000000000000000000000066666666000000000000000000
-00000000000000000000000000522222222222222222222222222230000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000003020222222222225000000000000000000000000000000000000000006422222222222222222222245600000000000000
-00000062222222222222222222222222230000000000000000000000000000000000062222222222222222222222222222222222222222223000000000000000
-00000000000000000000522222222222222222222222230000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000322222222222222222222222222230000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032222222222222222222222222222222222
-55555555555555555555555555555555322222222222222222222222222222222250000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000003222222222222222222222222222400000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000020202222222222230000000000000000000000000000000000000000000654222222222222234560000000000
-00000000000000032222222222222222222222222500000000000000000000000000000000000522222222222222222222222222222222222222222226000000
-00000000000000000000000000000222222222222222222222222300000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003222222222222222222222222222300000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005222222222222222222222222222
-22222222555555555555555555555555555555552222222222222222222222222222222223000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000022222222222222222222222222225000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000202022222222222260000000000000000000000000000000000000000000000665555566600000000
-00000000000000000000000622222222222222222222222226000000000000000000000000000000000003222222222222222222222222222222222222222222
-24000000000000000000000000000000000004222222222222222222222223000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022222222222222222222222222
-22300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032222222222222222222
-22222222222222223555555555555555555555555555555522222222222222222222222222222222260000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000006222222222222222222222222222250000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000062030022222222222400000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000322222222222222222222222300000000000000000000000000000000000622222222222222222222222222222222222
-22222222230000000000000000000000000000000000052222222222222222222222250000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006222222222222222222
-22222222223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005222222222222
-22222222222222222222222235555555555555555555555555555555222222222222222222222222222222224000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000042222222222222222222222222222600000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000520202222222222222600000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000006222222222222222222222225000000000000000000000000000000000005222222222222222222222222222
-22222222222222222260000000000000000000000000000000000022222222222222222222222500000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052222222222
-22222222222222222230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022222
-22222222222222222222222222222222255555555555555555555555555555532222222222222222222222222222222200000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000322222222222222222222222222226000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000004200002222222222224000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000003222222222222222222222260000000000000000000000000000000000042222222222222222222
-22222222222222222222222222500000000000000000000000000000000000422222222222222222222225000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000422
-22222222222222222222222222300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00422222222222222222222222222222222222222555555555555555555555555555555322222222222222222222222222222225000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000062222222222222222222222222222200000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000022020222222222222226000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000062222222222222222222223000000000000000000000000000000000000222222222222
-22222222222222222222222222222222223000000000000000000000000000000000005222222222222222222222260000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000322222222222222222222222222223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000062222222222222222222222222222222222222223555555555555555555555555555552222222222222222222222222222222300000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000422222222222222222222222222223000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000006220000222222222222230000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000032222222222222222222250000000000000000000000000000000000052222
-22222222222222222222222222222222222222222226000000000000000000000000000000000003222222222222222222222000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000062222222222222222222222222222230000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000322222222222222222222222222222222222222235555555555555555555555555555522222222222222222222222222222226000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222240000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042202062222222222222250000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000622222222222222222222000000000000000000000000000000000
-00042222222222222222222222222222222222222222222222250000000000000000000000000000000000042222222222222222222230000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000522222222222222222222222222222300000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000042222222222222222222222222222222222222222255555555555555555555555555553222222222222222222222222222222400
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000522222222222222222222222222222500
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000222000022222222222222260000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000322222222222222222240000000000000000000000000
-00000000000322222222222222222222222222222222222222222222222300000000000000000000000000000000000622222222222222222222400000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000003222222222222222222222222222223000000000000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000005222222222222222222222222222222222222222222555555555555555555555555555532222222222222222222222222
-22222400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222
-22222500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052220000222222222222
-22230000000000000000000000000000000000000000000000000000000000000000000000000000000000000005222222222222222222500000000000000000
-00000000000000000062222222222222222222222222222222222222222222222222000000000000000000000000000000000000322222222222222222225000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000
-00000000000000000000000000000000000622222222222222222222222222222230000000000000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000622222222222222222222222222222222222222222223555555555555555555555555555222222222222222222
-22222222222222360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000422222222222222222
-22222222222226000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000322200002222
-22222222222240000000000000000000000000000000000000000000000000000000000000000000000000000000000000003222222222222222220000000000
-00000000000000000000000000522222222222222222222222222222222222222222222222225000000000000000000000000000000000005222222222222222
-22226000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006230000000000000000000000000
-00000000000000000000000000000000000000000003222222222222222222222222222222300000000000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000003222222222222222222222222222222222222222222235555555555555555555555555552222222222
-22222222222222222222222246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062222222222
-22222222222222222222300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062222
-00002222222222222222250000000000000000000000000000000000000000000000000000000000000000000000000000000000000052222222222222222400
-00000000000000000000000000000000003222222222222222222222222222222222222222222222222240000000000000000000000000000000000062222222
-22222222222200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032230000000000000000
-00000000000000000000000000000000000000000000000000622222222222222222222222222222223000000000000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000322222222222222222222222222222222222222222222255555555555555555555555555322
-22222222222222222222222222222222225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000322
-22222222222222222222222222224000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000000
-00032222000022222222222222222250000000000000000000000000000000000000000000000000000000000000000000000000000000000000032222222222
-22222500000000000000000000000000000000000022222222222222222222222222222222222222222222222222200000000000000000000000000000000000
-03222222222222222224000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003222230000000
-00000000000000000000000000000000000000000000000000000000003222222222222222222222222222222230000000000000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000042222222222222222222222222222222222222222222222355555555555555555555
-55555222222222222222222222222222222222222222500000000000000000000000000000000000000000000000000000000000000000000000000000000000
-00004222222222222222222222222222222250000000000000000000000000000000005250000000000000000000000000000000000000000000000000000000
-00000000005222220000222222222222222222250000000000000000000000000000000000000000000000000000000000000000000000000000000000000522
-22222222222220000000000000000000000000000000000005222222222222222222222222222222222222222222222222222500000000000000000000000000
-00000000052222222222222222250000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000422222
-23600000000000000000000000000000000000000000000000000000000000000522222222222222222222222222222222300000000000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000004222222222222222222222222222222222222222222222223555555555555
-55555555555552222222222222222222222222222222222222222350000000000000000000000000000000000000000000000000000000000000000000000000
-00000000000522222222222222222222222222222222600000000000000000000000000000000032236000000000000000000000000000000000000000000000
-00000000000000000622222200002222222222222222222250000000000000000000000000000000000000000000000000000000000000000000000000000000
-00000032222222222222400000000000000000000000000000000000042222222222222222222222222222222222222222222222222224000000000000000000
-00000000000000000022222222222222223000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000
-05222222222600000000000000000000000000000000000000000000000000000000000052222222222222222222222222222222223000000000000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000422222222222222222222222222222222222222222222222225555
-55555555555555555555322222222222222222222222222222222222222222235000000000000000000000000000000000000000000000000000000000000000
-00000000000000000052222222222222222222222222222222230000000000000000000000000000000000322225000000000000000000000000000000000000
-00000000000000000000000002222222000022222222222222222222240000000000000000000000000000000000000000000000000000000000000000000000
-00000000000006322222222222225000000000000000000000000000000000000222222222222222222222222222222222222222222222222222220000000000
-00000000000000000000000000422222222222222250000000000000000000000000000000000223600000000000000000000000000000000000000000000000
-00000000522222222222500000000000000000000000000000000000000000000000000000000006222222222222222222222222222222222230000000000000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000042222222222222222222222222222222222222222222222
-22223555555555555555555555552222222222222222222222222222222222222222222223500000000000000000000000000000000000000000000000000000
-00000000000000000000000005222222222222222222222222222222222400000000000000000000000000000000002222223600000000000000000000000000
-00000000000000000000000000000000322222220000222222222222222222222240000000000000000000000000000000000000000000000000000000000000
-00000000000000000006322222222222222200000000000000000000000000000000000052222222222222222222222222222222222222222222222222222250
-00000000000000000000000000000000005222222222222222000000000000000000000000000000000062222500000000000000000000000000000000000000
-00000000000000052222222222222400000000000000000000000000000000000000000000000000000000622222222222222222222222222222222222300000
-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003222222222222222222222222222222222222222
-22222222222225555555555555555555555322222222222222222222222222222222222222222222222250000000000000000000000000000000000000000000
-00000000000000000000000000000000522222222222222222222222222222222225000000000000000000000000000000000622222222500000000000000000
-00000000000000000000000000000000000000032222222200002222222222222222222222236000000000000000000000000000000000000000000000000000
-00000000000000000000000005322222222222222224000000000000000000000000000000000000422222222222222222222222222222222222222222222222
-22222240000000000000000000000000000000000002222222222222240000000000000000000000000000000000522222500000000000000000000000000000
-00000000000000000000005222222222222222360000000000000000000000000000000000000000000000000000062222222222222222222222222222222222
-22300000000000000000000000000000000066000000000000000000000000000000000000000000000000000000006222222222222222222222222222222222
-22222222222222222222255555555555555555555552222222222222222222222222222222222222222222222222224600000000000000000000000000000000
-00000000000000000000000000000000000000042222222222222222222222222222222222200000000000000000000000000000000005222222222360000000
-00000000000000000000000000000000000000000000003222222222000622222222222222222222222225000000000000000000000000000000000000000000
-00000000000000000000000000000005322222222222222222250000000000000000000000000000000000003222222222222222222222222222222222222222
-22222222222222300000000000000000000000000000000000042222222222222234600000000000000000000000000000003222222360000000000000000000
-00000000000000000000000000000422222222222222222250000000000000000000000000000000000000000000000000005222222222222222222222222222
-22222222223000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000522222222222222222222222222
-22222222222222222222222222222355555555555555555555522222222222222222222222222222222222222222222222222222350000000000000000000000
-00000000000000000000000000000000000000000000063222222222222222222222222222222222223000000000000000000000000000000000042222222222
-25000000000000000000000000000000000000000000000000006322222222220000222222222222222222222222223600000000000000000000000000000000
-00000000000000000000000000000000000065222222222222222222222000000000000000000000000000000000000622222222222222222222222222222222
-22222222222222222222222600000000000000000000000000000000000522222222222222222245600000000000000000000000000022222222250000000000
-00000000000000000000000000000000000632222222222222222222236000000000000000000000000000000000000000000000000522222222222222222222
-22222222222222222230000000000000000000000000000000000225000000000000000000000000000000000000000000000000000632222222222222222222
-22222222222222222222222222222222222222555555555555555555553222222222222222222222222222222222222222222222222222222235600000000000
-00000000000000000000000000000000000000000000000000005222222222222222222222222222222222222222356000000000000000000000000000000222
-22222222223500000000000000000000000000000000000000000000000522222222222202022222222222222222222222222222400000000000000000000000
-00000000000000000000000000000000000000000064222222222222222222222240000000000000000000000000000000000005222222222222222222222222
-22222222222222222222222222222224000000000000000000000000000000000000322222222222222222222345000000000000000000000005222222222236
-00000000000000000000000000000000000000000052222222222222222222222224000000000000000000000000000000000000000000000632222222222222
-22222222222222222222222222300000000000000000000000000000000003225000000000000000000000000000000000000000000000000052222222222222
-22222222222222222222222222222222222222222222223555555555555555555522222222222222222222222222222222222222222222222222222222222450
-00000000000000000000000000000000000000000000000000000000006322222222222222222222222222222222222222222222450000000000000000000000
-00005222222222222222360000000000000000000000000000000000000000000042222222222222000022222222222222222222222222222250000000000000
-00000000000000000000000000000000000000000000000653222222222222222222222222500000000000000000000000000000000000032222222222222222
-22222222222222222222222222222222222222230000000000000000000000000000000000004222222222222222222222222346000000000000000000042222
-22222222360000000000000000000000000000000000000063222222222222222222222222222500000000000000000000000000000000000000000642222222
-22222222222222222222222222222222223000000000000000000000000000000000032223600000000000000000000000000000000000000000000053222222
-22222222222222222222222222222222222222222222222222222225555555555555555553222222222222222222222222222222222222222222222222222222
-22222222460000000000000000000000000000000000000000000000000000006322222222222222222222222222222222222222222222222223560000000000
-00000000000042222222222222222236000000000000000000000000000000000000000052222222222222220202222222222222222222222222222222224600
-00000000000000000000000000000000000000000000000000000542222222222222222222222222222334556600000000000000000000000000000222222222
-22222222222222222222222222222222222222222222222260000000000000000000000000000000000062222222222222222222222222222456000000000000
-00622222222222222235000000000000000000000000000000000064222222222222222222222222222222250000000000000000000000000000000000000642
-22222222222222222222222222222222222222222230000000000000000000000000000000000322222500000000000000000000000000000000000000000053
-22222222222222222222222222222222222222222222222222222222222222235555555555555555522222222222222222222222222222222222222222222222
-22222222222222222234600000000000000000000000000000000000000000000000005322222222222222222222222222222222222222222222222222222224
-50000000000000000000222222222222222222223500000000000000000000000000000000000053222222222222222200002222222222222222222222222222
-22222245000000000000000000000000000000000000000000000000005422222222222222222222222222222222222222223355660000000000000000000052
-22222222222222222222222222222222222222222222222222222222500000000000000000000000000000000000032222222222222222222222222222223450
-00000000005222222222222222223560000000000000000000000000000054222222222222222222222222222222222224500000000000000000000000000000
-00053222222222222222222222222222222222222222222222300000000000000000000000000000000003222222250000000000000000000000000000000000
-00005322222222222222222222222222222222222222222222222222222222222222222255555555555555552222222222222222222222222222222222222222
-22222222222222222222222222222245000000000000000000000000000000000000000000054222222222222222222222222222222222222222222222222222
-22222222223560000000000000052222222222222222222222245000000000000000000000000000000652222222222222222222020222222222222222222222
-22222222222222222450000000000000000000000000000000000000000000653222222222222222222222222222222222222222222222222222334556600000
-00000042222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222346000000022222222222222222222235600000000000000000000000643222222222222222222222222222222222222222245000000000000000000
-00000006542222222222222222222222222222222222222222222222223000000000000000000000000000000000032222222224600000000000000000000000
-00000000054222222222222222222222222222222222222222222222222222222222222222222222255555555555555322222222222222222222222222222222
-22222222222222222222222222222222222222222345600000000000000000000000000000000006542222222222222222222222222222222222222222222222
-22222222222222222222224560000000000322222222222222222222222222356000000000000000000000006532222222222222222222220202222222222222
-22222222222222222222222222224560000000000000000000000000000000000065322222222222222222222222222222222222222222222222222222222222
-22222335556600222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222456004222222222222222222222222245660000000000000665422222222222222222222222222222222222222222222222345600000
-00000000006654322222222222222222222222222222222222222222222222222230000000000000000000000000000000000322222222222346000000000000
-00000000000006542222222222222222222222222222222222222222222222222222222222222222222222222255555555555532222222222222222222222222
-22222222222222222222222222222222222222222222222222222335560000000000000000000000000654322222222222222222222222222222222222222222
-22222222222222222222222222222222234600000052222222222222222222222222222222345600000000000000654322222222222222222222222202022222
-22222222222222222222222222222222222222223556000000000000000000000000655332222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222223422222222222222222222222222222223333455333322222222222222222222222222222222222222222222222222222
-22222333345543332222222222222222222222222222222222222222222222222222222222300000000000000000000000000000000004222222222222222345
-60000000000000006553222222222222222222222222222222222222222222222222222222222222222222222222222222355555555553222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222335555666666666555433222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222245600322222222222222222222222222222222222223333554333222222222222222222222222222222
-02022222222222222222222222222222222222222222222222222233555566666655555333222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222223000000000000000000000000000000000052222222222
-22222222222333333333332222222222222222222222222222222222222222222222222222222222222222222222222222222222222355555555322222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222332222222222222222222222222222222222222222222222222222222222222222222222
-22222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222230000000000000000000000000000000000522
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222235555532222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222300000000000000000000000000000
-00000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-32222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223000000000000000000000
-00000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222230000000000000
-00000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222300000
-00000000000000000000000000000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22300000000000000000000000000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222223000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222230000000000000000000000000000000000522222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222200002222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222300000000000000000000000000000000005222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222223000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222220000222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222230000000000000000000000000000000000522222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222300000000000000000000000000000000005222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222000022222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222223000000000000000000000000000000000052222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222230000000000000000000000000000000000522222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222200002222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222300000000000000000000000000000000005222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-00002222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222223000000000000000000000000000000000052222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222000022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222230000000000000000000000000000000000522
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220000222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222300000000000000000000000000000
-00000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444
-44444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222200002222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223000000000000000000000
-00000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-44444444444444442222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222000022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222230000000000000
-00000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222224444444444444444444222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220000222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222300000
-00000000000000000000000000000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222224444444444444444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222200002222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22300000000000000000000000000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222444444444444444444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222000022222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222223000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222244444444444444444444444444422222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220000222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222230000000000000000000000000000000000522222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222224444444444444444444444444444422222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222200022222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222300000000000000000000000000000000005222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222444444444444444444444444444444222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222000022222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222223000000000000000000000000000000000052222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222224444444444444444444444444444444222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222230000000000000000000000000000000000522222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222444444444444444444444444444444444222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222200002222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222300000000000000000000000000000000005222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222224444444444444444444444444444444442222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222224000000000000000000000000000000000052222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222444444444444444444444444444444444422222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220000222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222250000000000000000000000000000000000522222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222224444444444444444444444444444444444422222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000000000005222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444444444444444444444444444222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-00062222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222225000000000000000000000000000000000052222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224444444444444444444444444444444444
-44222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222250000000000000000000000000000000000522
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444444444444444444
-44444444442222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222500000000000000000000000000000
-00000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222444444444444444444
-44444444444444444442222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222226000000000000000000000
-00000000000005222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224444444444
-44444444444444444444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222020222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222260000000000000
-00000000000000000000032222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244
-44444444444444444444444444444444444222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222000000
-00000000000000000000000000000322222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222244444444444444444444444444444444444442222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222202022222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22000000000000000000000000000000000003222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222444444444444444444444444444444444444222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222030022222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222220000000000000000000000000000000000032222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222224444444444444444444444444444444444442222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220202222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222300000000000000000000000000000000000322222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222224444444444444444444444444444444444422222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222200002222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222224000000000000000000000000000000000003222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222244444444444444444444444444444444444222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222020222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222250000000000000000000000000000000000032222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222444444444444444444444444444444444422222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222220000222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222500000000000000000000000000000000000322222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222444444444444444444444444444444444222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222202022222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222226000000000000000000000000000000000002222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222224444444444444444444444444444444442222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222000022222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222200000000000000000000000000000000000022222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222224444444444444444444444444444444222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220000222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222223000000000000000000000000000000000000222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444444444444444444444422222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222200002222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222240000000000000000000000000000000000002222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444444444444444444444222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-00002222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222223456000000000000000000000000000000622222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444444444444444444422
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222000022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222456000000000000000000000000006222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444444444444
-44444222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222220000222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222356000000000000000000
-00006222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222244444444444
-44444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222200002222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222345600000
-00000000000052222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222224
-44444444444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222000022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22234560000000000000522222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222244444444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222220000222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222224560000000004222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222224444444444422222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222200002222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222223450000032222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222000022222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222223456322222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222220000222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
-222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222220202040000002701ffff030000000000}}}{\insrsid2495527 
-
-\par }\pard\plain \s15\ql \li0\ri0\sb60\sa60\widctlpar\brdrb\brdrs\brdrw15\brsp20 \tqc\tx4153\tqr\tx9639\wrapdefault\faauto\rin0\lin0\itap0 \f1\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid2495527 \line \line \line \line }{\field{\*\fldinst 
-{\b\insrsid2495527  REF Doc_Issuing_Office \\* MERGEFORMAT}}{\fldrslt {\b\insrsid10304687\charrsid10304687 SLN}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 .}{\field{\*\fldinst {\b\insrsid2495527  REF Doc_Context_Project  \\
-* MERGEFORMAT }}{\fldrslt {\b\lang1024\langfe1024\noproof\insrsid10304687\charrsid10304687 AAA}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\field{\*\fldinst {\b\insrsid2495527  REF Doc_Context_Number  \\* MERGEFORMAT }}{\fldrslt {
-\b\lang1024\langfe1024\noproof\insrsid10304687\charrsid10304687 NNN}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 .}{\field{\*\fldinst {\b\insrsid2495527  REF Doc_Object_Number  \\* MERGEFORMAT }}{\fldrslt {
-\b\lang1024\langfe1024\noproof\insrsid10304687\charrsid10304687 NNNN}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 , Rev }{\field{\*\fldinst {\b\insrsid2495527  REF Doc_Version_Number  \\* MERGEFORMAT }}{\fldrslt {
-\b\lang1024\langfe1024\noproof\insrsid10304687\charrsid10304687 NNNN.NN}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 \tab \tab }{\field{\*\fldinst {\b\insrsid2495527  REF Doc_Title  \\* MERGEFORMAT }}{\fldrslt {
-\b\insrsid10304687\charrsid10304687 Sampling Profiler For}{\b\fs28\insrsid10304687  EPOC Devices}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 \line }{\field{\*\fldinst {\b\insrsid2495527  REF Doc_Status  \\* MERGEFORMAT }}{\fldrslt {
-\b\insrsid10304687\charrsid10304687 REVIEW}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 , }{\b\insrsid481371 {\*\xmlopen\xmlns1{\factoidname date}{\xmlattr\xmlattrns0{\xmlattrname Month}{\xmlattrvalue 7}}{\xmlattr\xmlattrns0
-{\xmlattrname Day}{\xmlattrvalue 9}}{\xmlattr\xmlattrns0{\xmlattrname Year}{\xmlattrvalue 2007}}}0}{\b\insrsid11890070 9}{\b\insrsid481371 /0}{\b\insrsid11890070 7}{\b\insrsid481371 /200}{\b\insrsid11890070 7}{\b\insrsid2495527 {\*\xmlclose}\tab \tab }
-{\field\fldedit{\*\fldinst {\b\insrsid2495527  REF Doc_Owner  \\* MERGEFORMAT }}{\fldrslt }}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527  - }{\field{\*\fldinst {\b\insrsid2495527  REF Doc_Function  \\* MERGEFORMAT }}{\fldrslt {
-\b\insrsid10304687\charrsid10304687 Development}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\b\insrsid2495527 
-\par }}{\footerr \pard\plain \s16\ql \li0\ri0\sb60\sa60\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4153\tqr\tx9639\wrapdefault\faauto\rin0\lin0\rtlgutter\itap0 \f1\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid2495527 \'a9 Symbian Ltd. }
-{\field{\*\fldinst {\insrsid2495527  SAVEDATE \\@ "yyyy" \\* MERGEFORMAT }}{\fldrslt {\lang1024\langfe1024\noproof\insrsid11890070 2007}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid2495527 \tab \tab Pg. }{\field{\*\fldinst {\insrsid2495527 
- PAGE  \\* MERGEFORMAT }}{\fldrslt {\lang1024\langfe1024\noproof\insrsid11890070 14}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid2495527  of }{\field{\*\fldinst {\insrsid2495527  NUMPAGES  \\* MERGEFORMAT }}{\fldrslt {
-\lang1024\langfe1024\noproof\insrsid11890070 14}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid2495527 
-\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}
-{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8
-\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA37\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8043\clshdrawnil \cellx9744\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 
-\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\f1\fs28\insrsid6226036 Document:\cell {\*\bkmkstart Doc_Title}}{\field\fldedit{\*\fldinst {\b\f1\fs28\insrsid6226036  FORMTEXT }{\b\f1\fs28\insrsid11890070 {\*\datafield 
-800100000000000009446f635f5469746c6500104e616d65204f6620446f63756d656e74000a5469746c652063617365001f456e74657220746865206e616d65206f66207468697320646f63756d656e740021456e74657220746865207469746c65206f66207468697320646f63756d656e742e0000000000}
-{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Title}{\*\ffdeftext Name Of Document}{\*\ffformat Title case}{\*\ffhelptext Enter the name of this document}{\*\ffstattext Enter the title of this document.}}}}}{\fldrslt {
-\b\f1\fs28\insrsid6226036 Sampling Profiler For EPOC Devices}}}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\b\f1\fs28\insrsid6226036 {\*\bkmkend Doc_Title}\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\f1\fs28\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA37\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8043\clshdrawnil \cellx9744\row }\trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA38\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4820\clshdrawnil \cellx6521\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1701\clshdrawnil \cellx8222\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1521\clshdrawnil \cellx9744\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\f1\insrsid6226036 Number:\cell {\*\bkmkstart Doc_Issuing_Office}}{\field\flddirty\fldpriv{\*\fldinst {\f1\insrsid6226036  FORMDROPDOWN }{\f1\insrsid11890070 {\*\datafield 
-8a8100000000000012446f635f49737375696e675f4f666669636500000000007f43686f6f7365207468652053796d6269616e2049737375696e67206f66666963653a20534342202d2043616d6272696467652c2053474c202d20476c6f62616c2c20534c4e202d204c6f6e646f6e2c20535259202d20526f6e6e6562792c
-20535346202d2053616e204672616e636973636f2c2053544f202d20546f6b796f003b456e746572207468652049737375696e67204f666669636520636f6465202d20463120666f72206578706c616e6174696f6e206f6620636f646573000000000024000600060000000a000c001000140018001c002000035343420353
-474c03534c4e03535259035353460353544f}{\*\formfield{\fftype2\ffres2\ffownhelp\ffownstat\fftypetxt0\ffhaslistbox{\*\ffname Doc_Issuing_Office}\ffdefres0{\*\ffhelptext 
-Choose the Symbian Issuing office: SCB - Cambridge, SGL - Global, SLN - London, SRY - Ronneby, SSF - San Francisco, STO - Tokyo}{\*\ffstattext Enter the Issuing Office code - F1 for explanation of codes}{\*\ffl SCB}{\*\ffl SGL}{\*\ffl SLN}{\*\ffl SRY}
-{\*\ffl SSF}{\*\ffl STO}}}}}{\fldrslt }}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\f1\insrsid6226036 {\*\bkmkend Doc_Issuing_Office}.{\*\bkmkstart Doc_Context_Project}}{\field{\*\fldinst {\f1\insrsid6226036 
- FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800103000000000013446f635f436f6e746578745f50726f6a656374000341414100095570706572636173650040456e7465722074686520646f63756d656e7420636f6e746578742070726f6a6563742067726f75702028746872656520746578742063686172616374657273290038456e7465722074686520646f63756d
-656e7420636f6e746578742070726f6a6563742067726f757072202d20463120666f722068656c702e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0\ffmaxlen3{\*\ffname Doc_Context_Project}{\*\ffdeftext AAA}{\*\ffformat Uppercase}{\*\ffhelptext 
-Enter the document context project group (three text characters)}{\*\ffstattext Enter the document context project groupr - F1 for help.}}}}}{\fldrslt {\f1\lang1024\langfe1024\noproof\insrsid6226036 AAA}}}\sectd 
-\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\*\bkmkstart Doc_Context_Number}{\*\bkmkend Doc_Context_Project}{\field{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800103000000000012446f635f436f6e746578745f4e756d62657200034e4e4e00095570706572636173650041456e7465722074686520646f63756d656e7420636f6e746578742070726f6a6563742073657175656e6365206e756d6265722028746872656520646967697473290041456e7465722074686520646f63756d
-656e7420636f6e746578742070726f6a6563742073657175656e6365206e756d626572202d20463120666f722068656c702e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0\ffmaxlen3{\*\ffname Doc_Context_Number}{\*\ffdeftext NNN}{\*\ffformat Uppercase}
-{\*\ffhelptext Enter the document context project sequence number (three digits)}{\*\ffstattext Enter the document context project sequence number - F1 for help.}}}}}{\fldrslt {\f1\lang1024\langfe1024\noproof\insrsid6226036 NNN}}}\sectd 
-\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\f1\insrsid6226036 {\*\bkmkend Doc_Context_Number}.{\*\bkmkstart Doc_Object_Number}}{\field{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800100000000000011446f635f4f626a6563745f4e756d62657200044e4e4e4e00095570706572636173650046456e7465722074686520646f63756d656e74206f626a6563742073657175656e6365206e756d6265722028756e6c696d69746564206e756d626572206f6620646967697473290038456e7465722074686520
-646f63756d656e74206f626a6563742073657175656e6365206e756d626572202d20463120666f722068656c702e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Object_Number}{\*\ffdeftext NNNN}{\*\ffformat Uppercase}{\*\ffhelptext 
-Enter the document object sequence number (unlimited number of digits)}{\*\ffstattext Enter the document object sequence number - F1 for help.}}}}}{\fldrslt {\f1\lang1024\langfe1024\noproof\insrsid6226036 NNNN}}}\sectd 
-\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\f1\insrsid6226036 {\*\bkmkend Doc_Object_Number}/{\*\bkmkstart Doc_Version_Number}}{\field{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800100000000000012446f635f56657273696f6e5f4e756d62657200074e4e4e4e2e4e4e0009557070657263617365006c456e7465722074686520646f63756d656e742076657273696f6e206e756d62657220696e2074686520666f6c6c6f77696e6720666f726d3a206e6e6e6e2e6e6e2e20557064617465207468652044
-6f63756d656e7420486973746f7279207461626c652061732077656c6c2e0030456e7465722074686520646f63756d656e742076657273696f6e206e756d626572202d20463120666f722068656c702e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Version_Number}
-{\*\ffdeftext NNNN.NN}{\*\ffformat Uppercase}{\*\ffhelptext Enter the document version number in the following form: nnnn.nn. Update the Document History table as well.}{\*\ffstattext Enter the document version number - F1 for help.}}}}}{\fldrslt {
-\f1\lang1024\langfe1024\noproof\insrsid6226036 NNNN.NN}}}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\b\f1\insrsid6226036 {\*\bkmkend Doc_Version_Number}\cell Status:\cell {\*\bkmkstart Doc_Status}}
-{\field\flddirty\fldpriv{\*\fldinst {\f1\insrsid6226036  FORMDROPDOWN }{\f1\insrsid11890070 {\*\datafield 
-86810000000000000a446f635f53746174757300000000002143686f6f73652074686520737461747573206f662074686520646f63756d656e74003443686f6f7365207374617475732066726f6d207468652064726f7020646f776e206c697374202d20463120666f722068656c702e00000000001a000300030000000a00
-06000c0013000544524146540652455649455706495353554544}{\*\formfield{\fftype2\ffres1\ffownhelp\ffownstat\fftypetxt0\ffhaslistbox{\*\ffname Doc_Status}\ffdefres0{\*\ffhelptext Choose the status of the document}{\*\ffstattext 
-Choose status from the drop down list - F1 for help.}{\*\ffl DRAFT}{\*\ffl REVIEW}{\*\ffl ISSUED}}}}}{\fldrslt }}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\b\f1\insrsid6226036 {\*\bkmkend Doc_Status}\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid6226036 \trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA38\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 
-\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth4820\clshdrawnil \cellx6521\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1701\clshdrawnil \cellx8222\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1521\clshdrawnil \cellx9744\row }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\f1\insrsid6226036 Owner:\cell }{\f1\insrsid6372845 Dennis May}{\b\f1\insrsid6226036 \cell 
-Last Revised:\cell }{\f1\insrsid9120167 {\*\xmlopen\xmlns1{\factoidname date}{\xmlattr\xmlattrns0{\xmlattrname Month}{\xmlattrvalue 7}}{\xmlattr\xmlattrns0{\xmlattrname Day}{\xmlattrvalue 9}}{\xmlattr\xmlattrns0{\xmlattrname Year}{\xmlattrvalue 2007}}}0}{
-\f1\insrsid11890070 9}{\f1\insrsid9120167 /0}{\f1\insrsid11890070 7}{\f1\insrsid8289572 /200}{\f1\insrsid11890070 7}{\b\f1\insrsid6226036 {\*\xmlclose}\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\f1\insrsid6226036 \trowd \irow2\irowband2\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA38\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4820\clshdrawnil \cellx6521\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1701\clshdrawnil \cellx8222\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1521\clshdrawnil \cellx9744\row }\trowd \irow3\irowband3
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA38\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8042\clshdrawnil \cellx9744\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\f1\insrsid6226036 Function:\cell 
-{\*\bkmkstart Doc_Function}}{\field\flddirty\fldpriv{\*\fldinst {\f1\insrsid6226036  FORMDROPDOWN }{\f1\insrsid11890070 {\*\datafield 
-8a810000000000000c446f635f46756e6374696f6e00000000004743686f6f736520746865206e616d65206f6620746865206f7267616e69736174696f6e616c2066756e6374696f6e2074686174206f776e73207468697320646f63756d656e742e004743686f6f736520746865206e616d65206f6620746865206f726761
-6e69736174696f6e616c2066756e6374696f6e2074686174206f776e73207468697320646f63756d656e742e0000000000d9000c000c0000000a00180027003b00470052005a006e0080009700a900b400c4000e41646d696e697374726174696f6e1344657369676e202620546563686e6f6c6f67790b446576656c6f706d
-656e740a466163696c69746965730746696e616e636513496e666f726d6174696f6e20537570706f7274114d61726b6574696e6720262053616c6573164f7267616e69736174696f6e616c20537570706f7274114f7065726174696f6e616c20426f6172640a50726f6772616d6d65730f48756d616e205265736f75726365
-7314546563686e6963616c20436f6e73756c74696e67}{\*\formfield{\fftype2\ffres2\ffownhelp\ffownstat\fftypetxt0\ffhaslistbox{\*\ffname Doc_Function}\ffdefres0{\*\ffhelptext Choose the name of the organisational function that owns this document.}{\*\ffstattext 
-Choose the name of the organisational function that owns this document.}{\*\ffl Administration}{\*\ffl Design & Technology}{\*\ffl Development}{\*\ffl Facilities}{\*\ffl Finance}{\*\ffl Information Support}{\*\ffl Marketing & Sales}{\*\ffl 
-Organisational Support}{\*\ffl Operational Board}{\*\ffl Programmes}{\*\ffl Human Resources}{\*\ffl Technical Consulting}}}}}{\fldrslt }}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\b\f1\insrsid6226036 
-{\*\bkmkend Doc_Function}\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f1\insrsid6226036 \trowd \irow3\irowband3
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA38\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8042\clshdrawnil \cellx9744\row }\trowd \irow4\irowband4\ts11\trgaph108\trleft-108\trbrdrb\brdrs\brdrw15 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8080\clshdrawnil \cellx9782\pard\plain \s17\ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \fs22\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {
-\b\f1\fs20\kerning0\insrsid6226036 Contributors:\cell {\*\bkmkstart Doc_Contributors}}{\field\fldedit{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800100000000000010446f635f436f6e7472696275746f727300144c697374204f6620436f6e7472696275746f7273000a5469746c6520636173650033456e7465722074686520746865206c697374206f6620636f6e7472696275746f727320746f2074686520646f63756d656e742e0033456e7465722074686520746865
-206c697374206f6620636f6e7472696275746f727320746f2074686520646f63756d656e742e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Contributors}{\*\ffdeftext List Of Contributors}{\*\ffformat Title case}{\*\ffhelptext 
-Enter the the list of contributors to the document.}{\*\ffstattext Enter the the list of contributors to the document.}}}}}{\fldrslt {\f1\lang1024\langfe1024\noproof\insrsid6226036 Adam Stevenson}}}\sectd 
-\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\f1\insrsid6372845 {\*\bkmkend Doc_Contributors}, Djordje Kovacevic}{\f1\insrsid9120167 , Mark Tai}{\insrsid6226036 \cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 \trowd \irow4\irowband4\ts11\trgaph108\trleft-108\trbrdrb\brdrs\brdrw15 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8080\clshdrawnil \cellx9782\row }\pard\plain \s17\ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \fs22\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {
-\b\f1\fs20\kerning0\insrsid6226036 Key Reviewers:\cell {\*\bkmkstart Doc_Reviewers}}{\field\fldedit{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-80010000000000000d446f635f52657669657765727300154c697374204f66204b657920526576696577657273000a5469746c6520636173650049456e74657220746865206c697374206f6620746865206b657920726576696577657273206f662074686520646f63756d656e742c2073657061726174656420627920636f
-6d6d61732e0030456e74657220746865206c697374206f66206b657920726576696577657273206f662074686520646f63756d656e742e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Reviewers}{\*\ffdeftext List Of Key Reviewers}{\*\ffformat 
-Title case}{\*\ffhelptext Enter the list of the key reviewers of the document, separated by commas.}{\*\ffstattext Enter the list of key reviewers of the document.}}}}}{\fldrslt {\f1\insrsid6226036 \u8194\'20\u8194\'20\u8194\'20\u8194\'20\u8194\'20}}}
-\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\f1\insrsid6372845 {\*\bkmkend Doc_Reviewers}Oleg Isakov}{\insrsid6226036 \cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 \trowd \irow5\irowband5\ts11\trgaph108\trleft-108\trbrdrb\brdrs\brdrw15 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8080\clshdrawnil \cellx9782\row }\pard\plain \s17\ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \fs22\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {
-\b\f1\fs20\kerning0\insrsid6226036 Distribution\cell {\*\bkmkstart Doc_Distribution}}{\field\fldedit{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800100000000000010446f635f446973747269627574696f6e0011446973747269627574696f6e204c697374000a5469746c6520636173650069456e74657220746865206c697374206f66207468652070656f706c65206f72206a6f622066756e6374696f6e732074686520646f63756d656e742073686f756c6420626520
-646973747269627574656420746f2c2073657061726174656420627920636f6d6d61732e0069456e74657220746865206c697374206f66207468652070656f706c65206f72206a6f622066756e6374696f6e732074686520646f63756d656e742073686f756c6420626520646973747269627574656420746f2c2073657061
-726174656420627920636f6d6d61732e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Distribution}{\*\ffdeftext Distribution List}{\*\ffformat Title case}{\*\ffhelptext 
-Enter the list of the people or job functions the document should be distributed to, separated by commas.}{\*\ffstattext Enter the list of the people or job functions the document should be distributed to, separated by commas.}}}}}{\fldrslt {
-\insrsid5055728 \u8194\'20\u8194\'20\u8194\'20\u8194\'20\u8194\'20}}}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\insrsid6226036 {\*\bkmkend Doc_Distribution}\cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 \trowd \irow6\irowband6\ts11\trgaph108\trleft-108\trbrdrb\brdrs\brdrw15 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8080\clshdrawnil \cellx9782\row }\trowd \irow7\irowband7\lastrow \ts11\trgaph108\trleft-108\trbrdrb\brdrs\brdrw15 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4820\clshdrawnil \cellx6521\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1701\clshdrawnil \cellx8222
-\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1559\clshdrawnil \cellx9782\pard\plain \s17\ql \li0\ri0\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 
-\fs22\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\b\f1\fs20\kerning0\insrsid6226036 Approved By:\cell {\*\bkmkstart Doc_Approval_Name}}{\field{\*\fldinst {\f1\insrsid6226036  FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800100000000000011446f635f417070726f76616c5f4e616d65001a4e616d65204f6620417070726f76616c20417574686f72697479000a5469746c6520636173650029456e74657220746865206e616d65206f662074686520617070726f76616c20617574686f726974792e0029456e74657220746865206e616d65206f
-662074686520617070726f76616c20617574686f726974792e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Approval_Name}{\*\ffdeftext Name Of Approval Authority}{\*\ffformat Title case}{\*\ffhelptext 
-Enter the name of the approval authority.}{\*\ffstattext Enter the name of the approval authority.}}}}}{\fldrslt {\f1\lang1024\langfe1024\noproof\insrsid6226036 Name Of Approval Authority}}}\sectd 
-\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\insrsid6226036 {\*\bkmkend Doc_Approval_Name}\cell }{\b\f1\fs20\kerning0\insrsid6226036 Approval Ref.:\cell {\*\bkmkstart Doc_Approval_Ref}}{\field{\*\fldinst {\f1\insrsid6226036 
- FORMTEXT }{\f1\insrsid11890070 {\*\datafield 
-800100000000000010446f635f417070726f76616c5f526566000c417070726f76616c20526566000a5469746c6520636173650026456e7465722074686520646f63756d656e7420617070726f76616c207265666572656e63652e0026456e7465722074686520646f63756d656e7420617070726f76616c20726566657265
-6e63652e0000000000}{\*\formfield{\fftype0\ffownhelp\ffownstat\fftypetxt0{\*\ffname Doc_Approval_Ref}{\*\ffdeftext Approval Ref}{\*\ffformat Title case}{\*\ffhelptext Enter the document approval reference.}{\*\ffstattext 
-Enter the document approval reference.}}}}}{\fldrslt {\f1\lang1024\langfe1024\noproof\insrsid6226036 Approval Ref}}}\sectd \psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\insrsid6226036 {\*\bkmkend Doc_Approval_Ref}\cell 
-}\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 \trowd \irow7\irowband7\lastrow \ts11\trgaph108\trleft-108\trbrdrb\brdrs\brdrw15 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4820\clshdrawnil \cellx6521\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1701\clshdrawnil \cellx8222
-\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1559\clshdrawnil \cellx9782\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\insrsid6226036 
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\ul\cf6\insrsid6226036 \sect }\sectd 
-\psz9\sbknone\linex0\headery709\footery709\colsx709\endnhere\sectunlocked1\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3
-\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnqc\pnstart1\pnindent720\pnhang 
-{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
-\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid6226036 {\*\bkmkstart _Toc420414641}Introduction
-{\*\bkmkend _Toc420414641}
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 {\*\bkmkstart _Toc420154979}{\*\bkmkstart _Toc420156457}
-{\*\bkmkstart _Toc420414642}Purpose and scope{\*\bkmkend _Toc420154979}{\*\bkmkend _Toc420156457}{\*\bkmkend _Toc420414642}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-This document describes the use of the sampling and analysis tools that can be used to profile execution on EPOC devices.}{\cf6\insrsid6226036 {\*\bkmkstart _Toc419889484}{\*\bkmkstart _Toc420414643}
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 References{\*\bkmkend _Toc419889484}{\*\bkmkend _Toc420414643}
-\par {\*\bkmkstart _Toc419889485}{\*\bkmkstart _Toc420414644}Open Issues{\*\bkmkend _Toc419889485}{\*\bkmkend _Toc420414644}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The following issues need to be resolved before this document is completed.
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid678217 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid678217 Abbrevations
-\par }\trowd \irow0\irowband0\ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb
-\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth8046\clshdrawnil \cellx9747
-\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\yts25 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid678217 XIP image\cell eXecuteInPlace ROM image. The executables are }{\insrsid481371 executed}{
-\insrsid678217  from the place they are stored. Their run addresses are decided during rombuild process. NOR Flash is }{\insrsid2495527 an example of }{\insrsid678217 XIP media.\cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid678217 \trowd \irow0\irowband0\ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 
-\trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb
-\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth8046\clshdrawnil \cellx9747
-\row }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\yts25 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid678217 non-XIP image\cell 
-The executables of the non-XIP image are copied into RAM before being run. Their run addresses are decided during run time. NAND Flash is }{\insrsid2495527 an example }{\insrsid678217 non-XIP media.\cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid678217 \trowd \irow1\irowband1\lastrow \ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb
-\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth8046\clshdrawnil \cellx9747
-\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\insrsid678217 
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 {\*\bkmkstart _Toc419889486}{\*\bkmkstart _Toc420414645}
-Document History{\*\bkmkend _Toc419889486}{\*\bkmkend _Toc420414645}
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft0\trhdr\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 \trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth1276\clshdngraw6000 \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth974\clshdngraw6000 \cellx2250\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth973\clshdngraw6000 \cellx3223\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth5709\clshdngraw6000 \cellx8932\pard\plain \s18\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \b\fs21\cf8\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Date\cell Version
-\cell Status\cell Description\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft0\trhdr\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 \trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth1276\clshdngraw6000 \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth974\clshdngraw6000 \cellx2250\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth973\clshdngraw6000 \cellx3223\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\clshdng6000\cltxlrtb\clftsWidth3\clwWidth5709\clshdngraw6000 \cellx8932\row }\trowd \irow1\irowband1\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 
-\trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr
-\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1276\clshdrawnil \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\cltxlrtb\clftsWidth3\clwWidth974\clshdrawnil \cellx2250\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth973\clshdrawnil \cellx3223
-\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth5709\clshdrawnil \cellx8932\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 {\*\xmlopen\xmlns1{\factoidname date}{\xmlattr\xmlattrns0{\xmlattrname Month}{\xmlattrvalue 9}}{\xmlattr\xmlattrns0{\xmlattrname Day}{\xmlattrvalue 27}}
-{\xmlattr\xmlattrns0{\xmlattrname Year}{\xmlattrvalue 2000}}}27/09/2000{\*\xmlclose}\cell }\pard \qc \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 0.01\cell }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Draft\cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow1\irowband1
-\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 \trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\cltxlrtb\clftsWidth3\clwWidth1276\clshdrawnil \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth974\clshdrawnil \cellx2250
-\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth973\clshdrawnil \cellx3223\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl
-\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth5709\clshdrawnil \cellx8932\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6372845 
-{\*\xmlopen\xmlns1{\factoidname date}{\xmlattr\xmlattrns0{\xmlattrname Month}{\xmlattrvalue 5}}{\xmlattr\xmlattrns0{\xmlattrname Day}{\xmlattrvalue 31}}{\xmlattr\xmlattrns0{\xmlattrname Year}{\xmlattrvalue 2005}}}31/05/2005{\*\xmlclose}\cell }\pard 
-\qc \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6372845 0.02\cell }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6372845 Draft\cell }{\insrsid2495527 Added}{\insrsid6372845  non-XIP support
-}{\insrsid2495527  in profiler}{\insrsid6372845 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6372845 \trowd \irow2\irowband2\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl
-\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 \trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt
-\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1276\clshdrawnil \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb
-\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth974\clshdrawnil \cellx2250\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\cltxlrtb\clftsWidth3\clwWidth973\clshdrawnil \cellx3223\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth5709\clshdrawnil \cellx8932\row 
-}\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid13524902 {\*\xmlopen\xmlns1{\factoidname date}{\xmlattr\xmlattrns0{\xmlattrname Month}{\xmlattrvalue 9}}{\xmlattr\xmlattrns0{\xmlattrname Day}{\xmlattrvalue 8}}
-{\xmlattr\xmlattrns0{\xmlattrname Year}{\xmlattrvalue 2006}}}08/09/2006{\*\xmlclose}\cell }\pard \qc \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid13524902 0.03\cell }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid13524902 Draft\cell Added description of \endash drive= option\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid13524902 \trowd \irow3\irowband3\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 \trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\cltxlrtb\clftsWidth3\clwWidth1276\clshdrawnil \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth974\clshdrawnil \cellx2250
-\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth973\clshdrawnil \cellx3223\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl
-\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth5709\clshdrawnil \cellx8932\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid11890070 
-{\*\xmlopen\xmlns1{\factoidname date}{\xmlattr\xmlattrns0{\xmlattrname Month}{\xmlattrvalue 7}}{\xmlattr\xmlattrns0{\xmlattrname Day}{\xmlattrvalue 9}}{\xmlattr\xmlattrns0{\xmlattrname Year}{\xmlattrvalue 2007}}}09/07/2007{\*\xmlclose}\cell }\pard 
-\qc \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid11890070 0.04\cell }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid11890070 Draft\cell Changed XIP to non-XIP for }{\cs27\insrsid11890070 
-\endash }{\cs27\insrsid11890070 rofs}{\cs27\insrsid11890070  option. }{\insrsid11890070 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid11890070 \trowd \irow4\irowband4\lastrow 
-\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw15\brdrcf1 \trbrdrl\brdrs\brdrw15\brdrcf1 \trbrdrb\brdrs\brdrw15\brdrcf1 \trbrdrr\brdrs\brdrw15\brdrcf1 \trbrdrh\brdrs\brdrw15\brdrcf1 \trbrdrv\brdrs\brdrw15\brdrcf1 
-\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 
-\cltxlrtb\clftsWidth3\clwWidth1276\clshdrawnil \cellx1276\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth974\clshdrawnil \cellx2250
-\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth973\clshdrawnil \cellx3223\clvertalt\clbrdrt\brdrs\brdrw15\brdrcf1 \clbrdrl
-\brdrs\brdrw15\brdrcf1 \clbrdrb\brdrs\brdrw15\brdrcf1 \clbrdrr\brdrs\brdrw15\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth5709\clshdrawnil \cellx8932\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\insrsid6226036 
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The profiling tool
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-The profiler consists of a program running on the target device which periodically samples the PC (program counter) and current thread ID, saving the resulting }{\i\insrsid6226036 trace data}{\insrsid6226036  to a file. This program comprises of:
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 a kernel-dependant device driver, currently only ARM targets are supported
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 an executable which can be controlled via command line, programmatically by IPC, or through a console interface
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 an optional DLL which provides a }{\i\insrsid6226036 hot-key}{\insrsid6226036  UI to replace the default console
-\par }\pard \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\insrsid6226036 
-Currently the sample rate is fixed at 1000Hz, typically generating 3Kb of data per second of processor activity. It can run on a standard build of EPOC (no kernel modifications are required), and does not require changes to the code to be profiled.
-\par }{\insrsid12336355 When profiler runs, it gets all the data from the device driver and stores it in memory. This ultimately becomes a limitation and when the profiler runs out of heap memory, it stops and writes all the data to disk. With a defaul
-t heap that can grow to 1MB and with 3Kb of data per second, the profiler will run for 5-6 minutes before running out of memory and stopping. You can increase the maximum heap size of the profiler in order for it to run longer.
-\par }{\insrsid12218284 The tool also supports profiling of non-XIP executables. It uses Kernel\rquote s debug interface to collects the relevant information regarding non-XIP code segments. In order to do so, Kernel must be built with }{
-\insrsid15342006\charrsid15342006 __DEBUGGER_SUPPORT__}{\insrsid15342006  }{\insrsid12218284 option.}{\insrsid7406415  (Assabet, Lubbock and H2 are all built by default in this way.)}{\insrsid12218284 
-\par }{\insrsid6226036 After }{\insrsid6816192 profiling the trace data file ([drive letter]}{\insrsid6226036 :\\PROFILER.DAT on the device) is transferred to a PC, where it can be processed using a Win32 tool: Analyse. Some of its feature include:
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 Providing various reports based on the trace data, including a basic trace listing, a thread/location profile distribution table and a thread/time profile
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 A rom symbol file can be used to translate code addresses into DLL or function names
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 The trace can be filtered in various ways before generating the report, e.g. restrict analysis to a single thread, process, DLL and/or time interval.
-\par {\pntext\pard\plain\f3\fs20\insrsid6226036 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\sb60\sa60\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
-\faauto\ls1\rin0\lin283\itap0\pararsid6890489 {\insrsid6226036 Output suitable for pasting directly into Excel can be generated to enable simple graphical analysis of the results
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid6226036 \page Using the profiler
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Installing the profiler
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 To 
-generate the profiling trace, the profile program must be installed on the EPOC device (e.g. by copying to a CF card). Three parts of the program need to be installed as follows:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2835\clshdrawnil \cellx4395\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth5353\clshdrawnil \cellx9748\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 File\cell Found in\cell Install to\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\insrsid6226036 \trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth2835\clshdrawnil \cellx4395\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth5353\clshdrawnil \cellx9748\row }\trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2835\clshdrawnil \cellx4395\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth5353\clshdrawnil \cellx9748\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Profiler.exe\cell \\epoc\\release\\}{\i\insrsid6226036 <ABI>}{\insrsid6226036 \\urel\cell \\}{
-\insrsid6372845 s}{\insrsid481371 ys}{\insrsid6226036 \\}{\insrsid6372845 bin}{\insrsid6226036  or other suitable location on the device\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil 
-\cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2835\clshdrawnil \cellx4395\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth5353\clshdrawnil \cellx9748\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Sampler.ldd\cell \\epoc\\release\\}{\i\insrsid6226036 <A}{\i\insrsid6890489 BI}{\i\insrsid6226036 >}{
-\insrsid6226036 \\urel\cell \\}{\insrsid6372845 s}{\insrsid6226036 ys\\}{\insrsid6372845 bin}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow2\irowband2
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2835\clshdrawnil \cellx4395\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth5353\clshdrawnil \cellx9748\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 ProfilerKeys.dll\cell \\epoc\\release\\}{\i\insrsid6226036 <ABI>}{\insrsid6226036 \\urel\cell \\}{
-\insrsid6372845 s}{\insrsid6226036 ys\\}{\insrsid6372845 bin}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow3\irowband3\lastrow 
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2835\clshdrawnil \cellx4395\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth5353\clshdrawnil \cellx9748\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid6226036 {\insrsid6226036 In this table, }{\i\insrsid6226036 ABI}{\insrsid6226036 
- refers to the flavour of ARM build required\emdash }{\insrsid6890489 e.g. ARM4. }{\insrsid6226036 The final component\emdash ProfilerKeys.dll\emdash 
-requires the full Window Server to function, thus it is optional and omitting from the installation will cause the profiler to provide a console UI instead of using hot keys.
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Running the profiler
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 To load the profiler, the Profiler.exe program must be execu
-ted on the target device, it then remains loaded until asked to exit.
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Profiler commands
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The Profiler understands four commands:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth959\clshdrawnil 
-\cellx851\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8895\clshdrawnil \cellx9746\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 start\cell }{
-\insrsid6226036 Start sampling, if not already doing so.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth959\clshdrawnil \cellx851\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8895\clshdrawnil \cellx9746\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 stop\cell }{
-\insrsid6226036 Stop sampling. If restarted, the new samples are added to the current trace data.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth959\clshdrawnil \cellx851\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8895\clshdrawnil \cellx9746\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 close\cell }{
-\insrsid6226036 Stop sampling if necessary and then close the trace data file. If restarted, the current trace data is discarded and a new trace file started. This allows the file to be copied from the internal disk without having to unload the profiler.
-\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow2\irowband2\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth959\clshdrawnil \cellx851\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth8895\clshdrawnil \cellx9746\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 unload\cell }{\insrsid6226036 
-Stop sampling if necessary and unload the profiler. This first ensures that all trace data is saved before the program exits.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow3\irowband3\lastrow \ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth959\clshdrawnil \cellx851\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8895\clshdrawnil \cellx9746\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid6372845 {\insrsid6372845 It also accepts the following options:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7903\clshdrawnil \cellx9746\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\b\insrsid6372845 -noui\cell }{\insrsid6372845 Starts profiler application without }{\insrsid12218284 user interface. }{\insrsid481371 Particularly}{\insrsid12218284  }{
-\insrsid481371 useful}{\insrsid12218284  on eshell window server system}{\insrsid2495527 s}{\insrsid12218284  with no touch sensitive screen.}{\insrsid6372845 
-\par }{\insrsid12218284 In such case, the profiler should be started from the ESHELL by:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12218284 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12218284 start profiler start \endash noui
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12218284 and stopped by:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12218284 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12218284 profiler exit\cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6372845 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7903\clshdrawnil \cellx9746\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\b\insrsid6372845 -xiponly\cell }{\insrsid12218284 Suppresses any activity in the tool regarding non-XIP }{\insrsid15342006 support}{\insrsid12218284 
-. This is recommended option when r}{\insrsid2495527 unning the profiler tool on XIP-}{\insrsid12218284 only platforms.}{\insrsid6372845 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6372845 
-\trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7903\clshdrawnil \cellx9746\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\b\insrsid6816192 -drive=[drive letter]}{\b\insrsid6816192\charrsid6816192 \cell }{\insrsid6816192 
-Specify which drive to store the trace data file (PROFILER.DAT), where [drive letter] can be }{\insrsid13524902 one of the 26 drive letters, }{\insrsid6816192 \lquote A\rquote  to \lquote Z\rquote 
-.  When this drive letter option is not specified the default drive C is used.  If the file cannot be created at the specified drive the profiler will not start.\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6816192 \trowd \irow2\irowband2\lastrow 
-\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthB3\trftsWidthA3\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7903\clshdrawnil \cellx9746\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid6372845 {\insrsid6372845\charrsid6372845 
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Command line control
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The Profiler can be controll
-ed from the command line, by specifying the action as a parameter to the Profiler.exe program. If the profiler is already loaded, this will just pass on the control request to the running program, otherwise it will load the profiler ready for further comm
-ands. E.g. use the following command in ESHELL:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 profiler start
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Console control
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-The console UI is used if the ProfilerKeys.dll is not present on the device. When the console is in the foreground, it interprets the following keypresses to control the profiler:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 Key\cell Action\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\row }\trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 s\cell }{\insrsid12218284 S}{
-\insrsid6226036 tart\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 p\cell }{\insrsid12218284 S}{
-\insrsid6226036 top\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow2\irowband2
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 c\cell }{\insrsid12218284 C}{
-\insrsid6226036 lose\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow3\irowband3
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 x\cell unload\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow4\irowband4\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone 
-\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\row 
-}\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 ?\cell Display the key mapping used to control the profiler\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid6226036 \trowd \irow5\irowband5\lastrow \ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4536\clshdrawnil \cellx5103\row }\pard\plain 
-\s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Hot key control
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-If ProfilerKeys.dll is installed then the profiler hooks the following key combinations which can be used to control the profiler from any application:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil \cellx6521\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\b\insrsid6226036 Key\cell Action\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil \cellx6521\row }\trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil \cellx6521\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Fn+Ctrl+Shift+1\cell start\cell 
-}\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil 
-\cellx6521\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Fn+Ctrl+Shift+2\cell stop\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow2\irowband2\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil 
-\cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil \cellx6521\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 
-Fn+Ctrl+Shift+3\cell close\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow3\irowband3
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil \cellx6521\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Fn+Ctrl+Shift+4\cell unload
-\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow4\irowband4\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil \cellx6521\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 Fn+Ctrl+Shift+0\cell Display the current operation of the profiler in an infoprint\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow5\irowband5\lastrow \ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1668\clshdrawnil \cellx1560\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth4961\clshdrawnil 
-\cellx6521\row }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Programmatic control
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-The profiler can also be controlled from within another program on the device by using the API defined in profiler.h. This defines the }{\f36\fs18\insrsid6226036 Profiler}{\insrsid6226036  class, which
- has static functions corresponding to each profiler command. Note that }{\f36\fs18\insrsid6226036 Profiler::Start()}{\insrsid6226036 
- will not load the profiler if it is not currently loaded, it will only cause an already loaded profiler to start sampling. It is possible to check for this possibility and use the command line to run the profiler using the following code:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 if (Profiler::Start() == KErrNotFound)\line \tab \{\line \tab _LIT(KProfiler,"profiler");
-\line \tab _LIT(KStart,"start");\line \tab RProcess p;\line \tab if (p.Create(KProfiler,KStart) == KErrNone)\line \tab \tab \{\line \tab \tab p.Resume();\line \tab \tab p.Close();\line \tab \tab \}\line \tab \}
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid6226036 \page Analysing the trace data
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-Once a trace data file has been obtained using the profiler, it needs to be transferred to a PC for analysis using the Analyse program, which should be present in the EPOC tools directory. Here are some example of standard 
-uses of the tool, followed by a complete command reference describing all of the options.
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Generating a full listing of the trace
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The full trace recorded in the trace file can be output in text form using the listing }{
-\f36\fs18\insrsid6226036 -listing}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -l}{\insrsid6226036 ) option:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -listing
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-This outputs one line for each sample, recording the sample number, thread ID and a PC value. A table mapping these thread IDs to thread names is provided at the end of the listing. By default, samples of the NULL thread are not shown\emdash processor
- inactivity can be detected by samples that are missing in the trace\emdash if necessary the NULL thread can be reported using the }{\f36\fs18\insrsid6226036 -null}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -n}{\insrsid6226036 ) option.
-\par A more interesting trace can be generated if a ROM symbol file matching the device ROM is available\emdash PC values are then displayed relative to symbols in the {\*\xmlopen\xmlns1{\factoidname country-region}}ROM.{\*\xmlclose} This is done using the }{
-\f36\fs18\insrsid6226036 -rom}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -r}{\insrsid6226036 ) command option:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -rom \\epoc32\\rom\\myrom.symbol -listing
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Finding out where threads spend most of their time
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 A distribution of thread against location can be generated using the }{\f36\fs18\insrsid6226036 
--profile}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -p}{\insrsid6226036 ) command option\emdash this is the default if }{\f36\fs18\insrsid6226036 -l}{\insrsid6226036  and }{\f36\fs18\insrsid6226036 -v}{\insrsid6226036 
- are omitted. The address space can be divided up by address, by DLL or by function, the latter two requiring a symbol file. The following command will analyse the trace and report the amount of time spent by each thread in each function in the ROM:
-
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -rom \\epoc32\\rom\\myrom.symbol -byfunction
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 You may need a very wide command prompt to read the tablulated output
- sensibly. The output begins with a summary of the sample analysed: the total number of samples, the number of active samples (i.e. ignoring the NULL thread), and the number of samples analysed in the following report. Then there is a thread ID to name ma
-p
-ping, followed by a table with the threads across the top and the locations down the right side. The first row contains the proportion of time spent overall in that thread, the last column is the proportion of time spent by all threads in that function. N
-ote that both the threads and locations are sorted into descending order.
-\par Usually, the last few threads and locations are of no interest for analysis, and eliminating them makes the output easier to follow. A \lquote cut off\rquote  value can be supplied which eliminates
- the output of results for threads or locations which contain fewer samples than the provided value. The }{\f36\fs18\insrsid6226036 -cutoff}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -c}{\insrsid6226036 
-) option takes a number which is specified in percent, e.g.
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -r \\epoc32\\rom\\myrom.symbol -bf -cutuff0.5
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 This produces th
-e same results as last time, but does not report on any threads or locations with less than 0.5% of the overall samples.
-\par }{\insrsid12336355 When using the analyse tool with a symbol file, there is a limitation you should be aware of. C static functions (LOCAL_C functions) ar
-e not listed in the symbol file by the tools (they do not appear in the .map file). As a consequence of this, hits in these functions will be wrongly attributed to the functions right before of them in {\*\xmlopen\xmlns1{\factoidname country-region}}
-{\*\xmlopen\xmlns1{\factoidname country-region}}ROM.{\*\xmlclose}{\*\xmlclose}
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Finding out when threads are executing
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 A distribution of thread activity against time can be generated using the }{\f36\fs18\insrsid6226036 
--activity}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -v}{\insrsid6226036 ) command option. The following command will analyse the trace and report the amount of time spent by each thread in each block of 1000 samples (1 second):
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -activity -bysize1000
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 If the }{\f36\fs18\insrsid6226036 -bysize}{\insrsid6226036 
- parameter is omitted, a default value of 100 samples is used. The cutoff option can be used to eliminate threads that contribute little to the overall execution time.
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Restricting the analysis to certain samples
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Filters ca
-n be provided to restrict the analysis to specific samples in the trace. These options generally work for all types of output.
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Filtering by thread name
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The samples for a specific thread can be analysed using the }{\f36\fs18\insrsid6226036 -thread}{
-\insrsid6226036  (}{\f36\fs18\insrsid6226036 -t}{\insrsid6226036 ) option, this is followed by a basic wildcard pattern for the thread name to analyse. (The }{\f36\fs18\insrsid6226036 *}{\insrsid6226036 
- character can represent zero or more of any character). E.g. to analyse just the threads in the file server the following commands could be used:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -r \\epoc32\\rom\\myrom.symbol -bf -thread efile*
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Filtering by dll name
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-Analysis for the thread/location distribution can be restricted to DLLs matching a provided pattern using the }{\f36\fs18\insrsid6226036 -dll}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -d}{\insrsid6226036 
-) option. E.g. to restrict analysis to BitGdi.dll the following command could be used:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -r \\epoc32\\rom\\myrom.symbol -bf -dll bitgdi.dll
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Filtering by function name
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 
-Analysis can be even more specific by providing a DLL and function pattern to match. In this case, the first matching function in the first matching DLL is analysed by ad
-dress, defaulting to instruction-level granularity. This can provide code-path analysis for execution hotspots. E.g. to analyse execution in the }{\f36\fs18\insrsid6226036 ExecuteJava()}{\insrsid6226036  function the following command could be used:
-
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -r \\epoc32\\rom\\myrom.symbol -d pjavai.dll -function executejava
-
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Note that the \lquote function name\rquote 
- usually includes the signature of the parameters, so it is often effective to add a }{\f36\fs18\insrsid6226036 *}{\insrsid6226036  to the end of the function name for analysis.
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Filtering by sample number
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 The }{\f36\fs18\insrsid6226036 -samples}{\insrsid6226036  (}{\f36\fs18\insrsid6226036 -s}{
-\insrsid6226036 ) option allows a
- specific range of samples to be analysed, rather than the entire file. This can be useful if the trace contains activity which should not be analysed, or for generating high-resolution activity traces for specific parts of the trace. E.g. to analyse 1000
- samples starting at sample number 2500, the following command could be used:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse profiler.dat -v -bs50 -samples2500+1000
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Generating graphs and charts from the output
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 By default, spaces are us
-ed when formatting the output resulting in tables that are easily read by eye. However, very often it helps to be able to generate charts from the tabulated data for visual analysis. The }{\f36\fs18\insrsid6226036 -formatexcel}{\insrsid6226036  (}{
-\f36\fs18\insrsid6226036 -mx}{\insrsid6226036 ) option instructs Analyse to format the output so t
-hat it is suitable for cut-and-paste into Microsoft Excel: using tabs rather than spaces, rearranging the tables for chart generation, and using numerical representation of sample data (rather than %). If the output from Analyse is directed to a file, thi
-s can then be opened by a text editor and the table can be pasted directly into Excel.
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid735290 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid735290 Profiling Jazelle code
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid735290 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid735290 
-Profiler tool clears the LSB bit in every sample. This is because it is used for some other markings that help keep log file short. ARM and Thumb i
-nstructions always appear on even program addresses. However, Jazelle instructions are one byte long and can appear on any program address. As the consequence, sampling Jazelle code does not give the exact result. If a Jazelle instruction on odd program a
-ddress is sampled, it will be reported as the Jazelle instruction on the preceding even program address.}{\insrsid735290\charrsid735290 
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid6226036 \page Analyse command reference
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Command line
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 analyse }{\f0\fs20\insrsid6226036 [ report-type ]}{\insrsid6226036  }{
-\f0\fs20\insrsid6226036 [ options ]}{\fs20\insrsid6226036  }{\i\f0\fs20\insrsid6226036 tracefile}{\insrsid6226036 
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Reports
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 
-Report type\cell Abbrev.\cell Description\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone 
-\clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -listing}{\insrsid6226036 \cell }{
-\f36\fs18\insrsid6226036 -l}{\insrsid6226036 \cell Generate a listing of the trace\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\trowd \irow2\irowband2\ts11\trgaph108\trrh221\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone 
-\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -profile}{\insrsid6226036 \cell }{
-\f36\fs18\insrsid6226036 -p}{\insrsid6226036 \cell Generate a thread vs. location profile of the data. This is the default type of report.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow2\irowband2\ts11\trgaph108\trrh221\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\trowd \irow3\irowband3\lastrow \ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone 
-\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835
-\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -activity}{
-\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -v}{\insrsid6226036 \cell Generate a thread activity profile of the data\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow3\irowband3\lastrow \ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 
-\b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Options
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 Option
-\cell Abbrev.\cell Description\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\insrsid6226036 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone 
-\clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -help}{\insrsid6226036 \cell }{
-\f36\fs18\insrsid6226036 -h}{\insrsid6226036 \line }{\f36\fs18\insrsid6226036 -?}{\insrsid6226036 \cell Display a brief summary of the command line options\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid6226036 \trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid1653898 -help config\cell -h }{\f2\fs18\insrsid1653898\charrsid1653898 
-config}{\f36\fs18\insrsid1653898 \cell }{\insrsid1653898 Display an example of the config file\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid1653898 \trowd \irow2\irowband2
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -rom}{\insrsid6226036  }{\i\insrsid6226036 symbolfile}{\insrsid6226036 \cell }{
-\f36\fs18\insrsid6226036 -r }{\insrsid6226036 \'85\cell Supply a ROM symbol file}{\insrsid3948828  of the XIP image}{\insrsid6226036  for interpretation of PC values\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow3\irowband3\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone 
-\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835
-\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -samples}{
-\i\insrsid6226036 range}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -s}{\insrsid6226036 \'85\cell Restrict the analysis to the sample range specified. The range can either be specified as }{\i\insrsid6226036 begin}{\f36\fs18\insrsid6226036 -}{
-\i\insrsid6226036 end}{\insrsid6226036  or as }{\i\insrsid6226036 begin}{\f36\fs18\insrsid6226036 +}{\i\insrsid6226036 count}{\insrsid6226036 , the sample numbers should be specified in decimal. So the following are equivalent:
-\par }{\f36\fs18\insrsid6226036 -samples2500-3500}{\insrsid6226036 \line }{\f36\fs18\insrsid6226036 -samples2500+1000}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow4\irowband4\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil 
-\cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -null}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -n}{\insrsid6226036 \cell Include
- the EPOC Kernel NULL thread in the analysis. This thread is ignored by default.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow5\irowband5
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -thread}{\insrsid6226036  }{\i\insrsid6226036 name}{\insrsid6226036 \cell }{
-\f36\fs18\insrsid6226036 -t }{\insrsid6226036 \'85\cell Restrict analysis to threads whose full name (}{\i\insrsid6226036 processname}{\insrsid6226036 ::}{\i\insrsid6226036 threadname}{\insrsid6226036 
-) matches the pattern provided. The pattern matching has a single wildcard character \lquote *\rquote , which will match zero or more of any character.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid6226036 \trowd \irow6\irowband6\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -dll }{\i\insrsid6226036 name}{\insrsid6226036 \cell }{
-\f36\fs18\insrsid6226036 -d }{\insrsid6226036 \'85\cell Restrict analysis to Dlls whose name matches the pattern provided.
-\par This option is only effective for a Profile report, and requires a ROM symbol file.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow7\irowband7
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -function }{\i\insrsid6226036 name}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -f }{
-\insrsid6226036 \'85\cell Restrict analysis to functions whose name matches the pattern provided. If }{\f36\fs18\insrsid6226036 -dll}{\insrsid6226036  is also specified, then only functions matching the pattern within a matching Dll are analysed.
-\par This option is only effective for a Profile report, and requires a ROM symbol file.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow8\irowband8
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -address}{\i\insrsid6226036 range}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -a}{
-\insrsid6226036 \'85\cell Restrict analysis to the address range specified. This may be useful if no symbol file is available when generating a Profile report. The range can either be specified as }{\i\insrsid6226036 begin}{\f36\fs18\insrsid6226036 -}{
-\i\insrsid6226036 end}{\insrsid6226036  or as }{\i\insrsid6226036 begin}{\f36\fs18\insrsid6226036 +}{\i\insrsid6226036 size}{\insrsid6226036 , the addresses should be specified in hexadecimal. So the following would both analyse the first 6Mb of the ROM:
-
-\par }{\f36\fs18\insrsid6226036 -address50000000-50600000}{\insrsid6226036 \line }{\f36\fs18\insrsid6226036 -address50000000+600000}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid6226036 \trowd \irow9\irowband9\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -by\'85}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -b\'85
-}{\insrsid6226036 \cell Determine the way in which the space is partitioned in a Profile or Activity report. Only one of the following four options should be specified:\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow10\irowband10\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil 
-\cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 
--bydll}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -bd}{\insrsid6226036 \cell Split the address space by Dll in a Profile report.
-\par This requires a ROM symbol file. It is the default partitioning if neither }{\f36\fs18\insrsid6226036 -dll}{\insrsid6226036  or }{\f36\fs18\insrsid6226036 \_function}{\insrsid6226036  are specified.\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow11\irowband11\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil 
-\cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 
--byfunction}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -bf}{\insrsid6226036 \cell Split the address space by function in a Profile report.
-\par This requires a ROM symbol file. It is the default partitioning if }{\f36\fs18\insrsid6226036 -dll}{\insrsid6226036  is specified without }{\f36\fs18\insrsid6226036 -function}{\insrsid6226036 .\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow12\irowband12\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil 
-\cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 
--bysize}{\i\insrsid6226036 size}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -bs}{\insrsid6226036 \'85\cell In a Profile report, this will split the address space into blocks of approximately }{\i\insrsid6226036 size}{\insrsid6226036 
- bytes. This assumes that either the }{\f36\fs18\insrsid6226036 -address}{\insrsid6226036  option has been used, or analysis is focussed on a single function using the }{\f36\fs18\insrsid6226036 -function}{\insrsid6226036 
- option. It is the default partitioning if }{\f36\fs18\insrsid6226036 -function}{\insrsid6226036  is specified, providing instruction level analysis.
-\par In an Activity report, this is the number of samples grouped in each line of the report. The default value of }{\i\insrsid6226036 size}{\insrsid6226036  in this case is 100 samples.\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow13\irowband13\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil 
-\cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 
--bynumber}{\i\insrsid6226036 count}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -bn}{\insrsid6226036 \'85\cell Split the address space into }{\i\insrsid6226036 count}{\insrsid6226036  \lquote buckets\rquote  in a Profile report.
-\par It is the default partitioning if }{\f36\fs18\insrsid6226036 -address}{\insrsid6226036  is specified, providing 100 buckets.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow14\irowband14\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil 
-\cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -cutoff}{\i\insrsid6226036 percent}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -c}{
-\insrsid6226036 \'85\cell Discard threads and locations from the output that account for less than }{\i\insrsid6226036 percent}{\insrsid6226036  samples in the analysis. }{\i\insrsid6226036 Percent}{\insrsid6226036 
- is a floating point percentage value, i.e. the following specifies a cutoff at 0.5%:
-\par }{\f36\fs18\insrsid6226036 -cutoff.5}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow15\irowband15
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -format\'85}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -m\'85}{\insrsid6226036 \cell 
-Modify the format of the reports. Any number of the following options can be concatenated into the option string, e.g.
-\par }{\f36\fs18\insrsid6226036 -formatexceltotalother}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow16\irowband16
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatpercent}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -mp}{\insrsid6226036 \cell 
-Report samples as a percentage of the total analysed. This is the default.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow17\irowband17
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatsamples}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -ms}{\insrsid6226036 \cell 
-Report the number of samples for each entry.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow18\irowband18
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatexcel}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -mx}{\insrsid6226036 \cell 
-Generate an excel compatible report for cut-and-paste.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow19\irowband19
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatzero\cell -mz}{\insrsid6226036 \cell 
-Report zero values explicitly. The default is to leave blanks.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow20\irowband20
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formattotal}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -mt}{\insrsid6226036 \cell 
-Just report the \lquote total\rquote  column in a Profile report, and discard the thread breakdown.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow21\irowband21
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatother}{\insrsid6226036 \cell }{\f36\fs18\insrsid6226036 -mo}{\insrsid6226036 \cell 
-Discard the \lquote other\rquote  location from a Profile report. This is where all samples that do not fit in another identified location are accumulated.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid6226036 \trowd \irow22\irowband22\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid5454414 -oby}{\f36\fs18\insrsid15342006 \cell }{
-\f36\fs18\insrsid5454414 -o}{\f36\fs18\insrsid15342006 \cell }{\insrsid5454414 Supply oby file of the non-XIP image}{\insrsid15342006 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid15342006 
-\trowd \irow23\irowband23\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil 
-\cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid3948828 -}{\f36\fs18\insrsid3948828\charrsid3948828 rofs}{\f36\fs18\insrsid5454414\charrsid3948828 
-\cell }{\f36\fs18\insrsid5454414 -z\cell }{\insrsid5454414 Supply symbol file of the }{\insrsid16414626 non-}{\insrsid5454414 XIP image\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid5454414 
-\trowd \irow24\irowband24\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil 
-\cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid3948828 -}{\f36\fs18\insrsid3948828\charrsid3948828 config\cell }{\f36\fs18\insrsid3948828 -x\cell }
-{\insrsid3948828 Supply configuration file. The file can contains all input argument and options. A template of the file is given in Appendix A.\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\insrsid3948828 \trowd \irow25\irowband25\lastrow \ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1951\clshdrawnil \cellx1843\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth992\clshdrawnil \cellx2835\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6912\clshdrawnil \cellx9747\row }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0 
-\b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid6226036 Options used in each type of report
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\pard\plain 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\b\insrsid6226036 Option\cell Listing\cell Profile\cell Activity\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\b\insrsid6226036 \trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb
-\brdrs\brdrw15 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl
-\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -rom\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {
-\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow1\irowband1\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone 
-\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552
-\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -samples\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {
-\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 
-{\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow2\irowband2
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -null\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings"
- \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt
-\f10\fs20}}}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow3\irowband3
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -thread\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings"
- \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt
-\f10\fs20}}}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow4\irowband4
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -dll\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f 
-"Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow5\irowband5
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -function\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow6\irowband6
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -address\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow7\irowband7
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -bydll\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow8\irowband8
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -byfunction\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow9\irowband9
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -bysize\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow10\irowband10\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil 
-\cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -bynumber\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {
-\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow11\irowband11\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -cutoff\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow12\irowband12\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil 
-\cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatpercent\cell }\pard 
-\qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow13\irowband13
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatsamples\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow14\irowband14\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil 
-\cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatexcel\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 
-{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell 
-}\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow15\irowband15\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil 
-\cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatzero\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {
-\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell 
-}\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow16\irowband16\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil 
-\cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formattotal\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 
-{\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 
-\trowd \irow17\irowband17\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil 
-\cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid6226036 -formatother\cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid6226036 \cell }{\insrsid6226036 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid6226036 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid6226036 \trowd \irow18\irowband18
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid3948828 - o}{\f36\fs18\insrsid678217 by}{\f36\fs18\insrsid3948828 \cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid3948828 
-{\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell }{\insrsid3948828 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell \cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid3948828 \trowd \irow19\irowband19\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt
-\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil 
-\cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard \ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid3948828 - }{\f36\fs18\insrsid678217 rofs}{\f36\fs18\insrsid3948828 \cell }\pard 
-\qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid3948828 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell }{\insrsid3948828 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings"
- \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid3948828 \trowd \irow20\irowband20
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\f36\fs18\insrsid3948828 - }{\f36\fs18\insrsid678217 config}{\f36\fs18\insrsid3948828 \cell }\pard \qc \li0\ri0\sb40\sa40\widctlpar\intbl\wrapdefault\faauto\rin0\lin0 {\insrsid3948828 
-{\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell }{\insrsid3948828 {\field{\*\fldinst SYMBOL 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell }{\insrsid3948828 {\field{\*\fldinst SYMBOL
- 252 \\f "Wingdings" \\s 10}{\fldrslt\f10\fs20}}}{\insrsid3948828 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid3948828 \trowd \irow21\irowband21\lastrow 
-\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1809\clshdrawnil \cellx1701\clvertalt
-\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth851\clshdrawnil \cellx2552\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
-\cltxlrtb\clftsWidth3\clwWidth850\clshdrawnil \cellx3402\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth993\clshdrawnil \cellx4395\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\insrsid678217 
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0\pararsid678217 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid678217 \page 
-Appendix A: non-XIP support and configuration file}{\insrsid6226036 
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid678217 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid10961137 N}{\insrsid678217 
-on-XIP executables are copied into RAM memory before being executed. Their run addresses are not known during ROM image build up. Therefore, corresponding symbol file does not contain run addresses of each particular function in the image, as }{
-\insrsid15867397 it}{\insrsid678217  is the case with XIP images. Instead, it contains the offset}{\insrsid11476477 s}{\insrsid678217  of the functions }{\insrsid10961137 within their }{\insrsid678217 e}{\insrsid5070621 xe}{\insrsid678217 cutables.
-\par }{\insrsid11476477 In order to calculate actual run addresses of non-XIP }{\insrsid15867397 functions}{\insrsid11476477 , the profiler tool also collects the events }{\insrsid5070621 of}{\insrsid10961137  non-XIP}{\insrsid11476477  code segment}{
-\insrsid10961137 s}{\insrsid11476477  creation/deletion. It uses Kernel debug interface and Kernel has to be built with }{\insrsid11476477\charrsid15342006 __DEBUGGER_SUPPORT__}{\insrsid3544718  option.}{\insrsid11476477 
-\par }{\insrsid3544718 During start}{\insrsid5070621 -}{\insrsid3544718 up of the }{\insrsid15867397 profiler }{\insrsid3544718 tool,}{\insrsid15867397  }{\insrsid3544718 the current list of all active non-XIP }{\insrsid10961137 code segments }{
-\insrsid3544718 are collected and stored into the c:\\profiler.dat. Once the profiling }{\insrsid10961137 is }{\insrsid3544718 started, the driver is still }{\insrsid481371 continuously}{\insrsid3544718  }{\insrsid10961137 monitoring}{\insrsid3544718 
- for such events and logs them into the file, alongside with sample data.
-\par }{\insrsid5070621 
-\par }{\insrsid15867397 For each particular non-XIP ima}{\insrsid481371 ge, both oby and symbol file have}{\insrsid15867397  to be provided to the analyse tool (XIP image requires only symbol }{\insrsid5070621 file}{\insrsid15867397 
-). As there could be more non-XIP images in the system, a more convenient way for passing input argument}{\insrsid481371 s}{\insrsid15867397  to analyse tool would }{\insrsid5070621 be }{\insrsid15867397 by }{\insrsid5070621 means of }{\insrsid15867397 
-configuration file.}{\insrsid3544718 
-\par }{\insrsid5070621 Below}{\insrsid15867397  is }{\insrsid481371 an}{\insrsid15867397  example of the configuration file to profile }{\insrsid9066106 NAND image of H2 Techview.}{\insrsid15867397 
-\par }{\insrsid5070621 It is used as:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0\pararsid5070621 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid5070621 analyse \endash x analyse.cfg
-\par }\pard \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0\pararsid335316 {\insrsid5070621 
-\par }{\fs16\insrsid5070621\charrsid4540351 ;***************************
-\par }{\fs16\insrsid335316\charrsid4540351 ;Analase.cfg file
-\par [Common]
-\par TraceFile=PROFILER.DAT
-\par ;Mode=listing|profile|activity
-\par }{\fs16\insrsid10961137\charrsid4540351 Mode=profile}{\fs16\insrsid335316\charrsid4540351 
-\par SymbolFile=om_001.techview.nand.symbol
-\par ;Range=100-200 | 100+100
-\par ;IncludeNullThread=0|1
-\par 
-\par [Profile]
-\par Thread=
-\par Dll=
-\par Function=
-\par ;Range=1f1a+20 | 1f1a-1f3a
-\par Range=
-\par 
-\par [Partition]
-\par ;Mode=dll|function
-\par BucketSize=
-\par NumberOfBuckets=
-\par 
-\par [Format]
-\par ;Mode=percentages|samples|excel
-\par Mode=
-\par ;ZeroValues=0|1
-\par ZeroValues=
-\par ;NoOthers=0|1
-\par NoOthers=
-\par ;TotalOnly=0|1
-\par TotalOnly=
-\par 
-\par [NonXIP]
-\par ObyFile1=om_001.techview.nand.rofs.oby
-\par RofsSymbolFile1=om_001.techview.nand.rofs.symbol}{\fs16\insrsid9066106\charrsid4540351 
-\par }\pard \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0\pararsid5070621 {\fs16\insrsid5070621\charrsid4540351 ;***************************
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid1653898 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid1653898 Any option provided in the configur
-ation file can be overwritten by the same option in the command line.
-\par 
-\par }\pard\plain \s1\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0\pararsid1653898 \b\f1\fs24\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\insrsid10961137 \page 
-Appendix B: The format of the profiler.dat file}{\insrsid15867397 
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid8592727 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392815}Basic Elements
-{\*\bkmkend _Toc100392815}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Profiler.dat is built}{\insrsid5070621  up }{\insrsid8592727 
-from the following basic elements:
-\par {\listtext\pard\plain\fs20\insrsid8592727 \hich\af0\dbch\af0\loch\f0 -\tab}}\pard \ql \fi-360\li450\ri0\sb60\sa60\widctlpar\jclisttab\tx450\wrapdefault\faauto\ls5\rin0\lin450\itap0\pararsid8592727 {\insrsid8592727 UInt (32-bits unsigned integer);
-\par {\listtext\pard\plain\fs20\insrsid8592727 \hich\af0\dbch\af0\loch\f0 -\tab}Int (32-bit signed integer);
-\par {\listtext\pard\plain\fs20\insrsid8592727 \hich\af0\dbch\af0\loch\f0 -\tab}Text (up to 255 bytes long non-unicode text).
-\par }\pard \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 {\insrsid8592727 
-\par They are encoded as:
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0\pararsid8592727 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392816}UInt{\*\bkmkend _Toc100392816}
-
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 
-7 bits occupies a byte (starting from the least significant bits) with MSB=1 in the last byte. To decode, value should be extended to 32-bit length by 0s.
-\par }\trowd \irow0\irowband0\ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\pard\plain 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid481371\yts25 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 UInt}{\insrsid481371  (32 bits divided into groups of 7 bits)}{\insrsid8592727 \cell 
-Encoded as:\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow0\irowband0\ts25\trgaph108\trleft-108\trbrdrt
-\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row 
-}\trowd \irow1\irowband1\ts25\trgaph108\trrh301\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\pard\plain 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527\yts25 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\fs18\insrsid8592727\charrsid8592727 1001}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{
-\f2\fs18\insrsid8592727\charrsid8592727 1000110}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1000011}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1101100}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 0001101 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{
-\f2\fs18\insrsid8592727\charrsid8592727 1101100 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1000011 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1000110 }{
-\b\f2\fs18\insrsid8592727\charrsid8592727 1}{\i\f2\fs18\insrsid8592727\charrsid8592727 000}{\f2\fs18\insrsid8592727\charrsid8592727 1001\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 
-\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow1\irowband1\ts25\trgaph108\trrh301\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 
-\trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 
-\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil 
-\cellx9747\row }\trowd \irow2\irowband2\ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\pard\plain 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527\yts25 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\fs18\insrsid8592727\charrsid8592727 0000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{
-\f2\fs18\insrsid8592727\charrsid8592727 0000000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0000000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0001100}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 0001101 }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{
-\f2\fs18\insrsid8592727\charrsid8592727 0001100\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow2\irowband2
-\ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row 
-}\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527\yts25 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\fs18\insrsid8592727\charrsid8592727 0000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{
-\f2\fs18\insrsid8592727\charrsid8592727 0000000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0000000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0000000}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow3\irowband3\lastrow \ts25\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tbllkhdrrows\tbllklastrow\tbllkhdrcols\tbllklastcol\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4409\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row 
-}\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0\pararsid8592727 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392817}Int{\*\bkmkend _Toc100392817}
-
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 
-7 bits occupies a byte (starting from the least significant bits) with MSB=1 in the last byte. To decode, value should be extended to 32-bit length by the most significant bit.}{\insrsid8592727\charrsid8592727 
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid481371 {
-\insrsid8592727 Int}{\insrsid481371  (32 bits divided into groups of 7 bits)}{\insrsid8592727 \cell Encoded as:\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid8592727 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
-\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row }\trowd \irow1\irowband1\ts11\trgaph108\trrh297\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv
-\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil 
-\cellx4508\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\f2\fs18\insrsid8592727\charrsid8592727 1001}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1000110}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1000011}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1101100}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{
-\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 0001101 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1101100 }{
-\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1000011 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1000110 }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{
-\b\i\f2\fs18\insrsid8592727\charrsid8592727 111}{\f2\fs18\insrsid8592727\charrsid8592727 1001\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f2\insrsid8592727 \trowd \irow1\irowband1
-\ts11\trgaph108\trrh297\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row }\trowd \irow2\irowband2\ts11\trgaph108\trrh301\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 
-\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil 
-\cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\f2\fs18\insrsid8592727\charrsid8592727 1111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{
-\f2\fs18\insrsid8592727\charrsid8592727 1111111\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{\f2\fs18\insrsid8592727\charrsid8592727 1111111\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\f2\insrsid8592727 \trowd \irow2\irowband2\ts11\trgaph108\trrh301\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 
-{\f2\fs18\insrsid8592727\charrsid8592727 0111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{
-\f2\fs18\insrsid8592727\charrsid8592727 1111111 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1111111 }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1111111 }{
-\b\f2\fs18\insrsid8592727\charrsid8592727 0}{\f2\fs18\insrsid8592727\charrsid8592727 1111111 }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{\b\i\f2\fs18\insrsid8592727\charrsid8592727 000}{\f2\fs18\insrsid8592727\charrsid8592727 0111}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f2\insrsid8592727 \trowd \irow3\irowband3\ts11\trgaph108\trrh301\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 
-\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil 
-\cellx9747\row }\trowd \irow4\irowband4\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {
-\f2\fs18\insrsid8592727\charrsid8592727 1111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 1111111\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 0}{
-\f2\fs18\insrsid8592727\charrsid8592727 1111111 }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{\f2\fs18\insrsid8592727\charrsid8592727 1111000\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\f2\insrsid8592727 \trowd \irow4\irowband4\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 
-{\f2\fs18\insrsid8592727\charrsid8592727 0000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0000000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0000000}{
-\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0000000}{\b\f2\fs18\insrsid8592727\charrsid8592727 |}{\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }{\b\f2\fs18\insrsid8592727\charrsid8592727 1}{
-\f2\fs18\insrsid8592727\charrsid8592727 0001101\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f2\insrsid8592727 \trowd \irow5\irowband5\lastrow \ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 
-\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4537\clshdrawnil \cellx4508\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5543\clshdrawnil 
-\cellx9747\row }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0\pararsid8592727 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392818}Text
-{\*\bkmkend _Toc100392818}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Supports up to 255 long non Unicode text:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid481371 {
-\insrsid8592727 Text\cell Encoded as:\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid8592727 \trowd \irow0\irowband0\ts11\trgaph108\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb
-\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 
-\clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil \cellx9747\row 
-}\trowd \irow1\irowband1\ts11\trgaph108\trrh297\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil \cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {
-\f2\fs18\insrsid8592727\charrsid8592727 \'93Text\'94\cell 4, \lquote T\rquote , \lquote e\rquote , \lquote x\rquote , \lquote t\rquote \cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f2\insrsid8592727 
-\trowd \irow1\irowband1\ts11\trgaph108\trrh297\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil \cellx9747\row }\trowd \irow2\irowband2\ts11\trgaph108\trrh301\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 
-\clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil 
-\cellx9747\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\f2\fs18\insrsid8592727\charrsid8592727 \lquote x\rquote  times 255\cell 255, \lquote x\rquote  times 255\cell }\pard 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\f2\insrsid8592727 \trowd \irow2\irowband2\ts11\trgaph108\trrh301\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 
-\trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil \cellx9747\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid2495527 {\f2\fs18\insrsid8592727\charrsid8592727 \'93\'94\cell 0\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\f2\insrsid8592727 \trowd \irow3\irowband3\lastrow \ts11\trgaph108\trrh301\trleft0\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind108\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4500\clshdrawnil \cellx4354
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5580\clshdrawnil \cellx9747\row }\pard\plain 
-\s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid8592727 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392819}Derived Elements
-{\*\bkmkend _Toc100392819}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 The following derived elements are defined as well:
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0\pararsid8592727 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392820}Tag{\*\bkmkend _Toc100392820}
-
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid5070621 This is the header of the file.}{\insrsid8592727 
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0\pararsid8592727 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Tag = Text(\'93Profiler\'94) + UInt(MajorVersionNumber)
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0\pararsid8592727 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392821}Thread
-{\*\bkmkend _Toc100392821}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 
-Contains processID and thread name. Also can contain process name if the process is seen for the first time:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0\pararsid8592727 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 
-Thread(DThread*) = UInt(processID) [+ Text(processName) ]+ Text(threadName]
-\par }\pard\plain \s3\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel2\rin0\lin0\itap0\pararsid8592727 \f1\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392822}Repeat
-{\*\bkmkend _Toc100392822}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8592727 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Encode repeated sequence of the same sample:
-\par }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin284\itap0\pararsid8592727 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Repeat(x) = Int(0) + UI}{\insrsid12536172 nt(x)}{\insrsid8592727 :
-\par }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid8592727 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 {\*\bkmkstart _Toc100392823}File build up
-{\*\bkmkend _Toc100392823}
-\par {\listtext\pard\plain\fs20\insrsid8592727 \hich\af0\dbch\af0\loch\f0 -\tab}}\pard\plain \ql \fi-360\li405\ri0\sb60\sa60\widctlpar\jclisttab\tx405\wrapdefault\faauto\ls6\rin0\lin405\itap0\pararsid12536172 
-\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 File starts with Tag element.
-\par {\listtext\pard\plain\fs20\insrsid8592727 \hich\af0\dbch\af0\loch\f0 -\tab}It is followed by samples that are recorded as:
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid8592727 Sample description\cell Sample record\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
-\f2\insrsid8592727 \trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid8592727 The first sample record}{\insrsid12536172 .}{\insrsid8592727 \cell }\pard\plain 
-\s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Int(PC | 1)
-\par }{\f2\fs20\insrsid8592727 UInt(threadID)
-\par UInt(processID)   ]
-\par Text(processName) ] Thread element
-\par Text(threadName)  ]\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow1\irowband1\ts11\trgaph108\trleft-108
-\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
-\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid481371 A s}{\insrsid8592727 
-ample record with a new thread and a new process seen\cell }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 
-Int((PC - PC of the previous sample) | 1)
-\par }{\f2\fs20\insrsid8592727 UInt(threadID)
-\par UInt(processID)   ]
-\par Text(processName) ] Thread element
-\par Text(threadName)  ]\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow2\irowband2\ts11\trgaph108\trleft-108
-\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 
-\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr
-\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid481371 A s}{\insrsid8592727 
-ample record with a new thread seen (with already known process)\cell }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 
-Int((PC - PC of the previous sample) | 1)
-\par }{\f2\fs20\insrsid8592727 UInt(threadID)
-\par UInt(processID)   ]
-\par Text(threadName)  ] Thread element\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow3\irowband3
-\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid481371 A s}{\insrsid8592727 ample record with already known thread\cell }\pard\plain 
-\s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Int((PC - PC of the previous sample) | 1)
-\par }{\f2\fs20\insrsid8592727 UInt(threadID)\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow4\irowband4
-\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid481371 A s}{\insrsid8592727 ample with the same thread ID as the previous sample\cell }\pard\plain 
-\s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 Int(PC - PC of the previous sample)\cell }\pard\plain 
-\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\f2\insrsid8592727 \trowd \irow5\irowband5\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl
-\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 
-\clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid481371 A s}{\insrsid8592727 
-amples with the same PC and threadID that repeat N consecutive times\cell }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {
-\insrsid8592727 <Any sample record described above>
-\par Repeat(N-1)\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid8592727 \trowd \irow6\irowband6\lastrow \ts11\trgaph108\trleft-108\trbrdrt
-\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trftsWidthB3\trftsWidthA3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt
-\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4455\clshdrawnil \cellx4347\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth5400\clshdrawnil \cellx9747\row }\pard\plain \s2\ql \li0\ri0\sb120\sa60\keepn\widctlpar\wrapdefault\faauto\outlinelevel1\rin0\lin0\itap0\pararsid12536172 \b\i\f1\fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {
-\insrsid12536172 {\*\bkmkstart _Toc100392824}Non-XIP code support{\*\bkmkend _Toc100392824}
-\par }\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid12536172 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 
-The record of non-XIP DCodeSeg creation/deletion can be inserted between any two consecutive sample records. It can also appea}{\insrsid5070621 r immediately after Tag element or just before Repeat element.}{\insrsid12536172 
-\par All records (samples and DCodeSeg) are placed in chronological order.
-\par }\pard\plain \s26\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12536172 \f2\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\insrsid12536172 
-\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4788\clshdrawnil \cellx4348\clvertalt
-\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5688\clshdrawnil \cellx9747\pard\plain \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 
-\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 Description\cell Recorded as\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid12536172 \trowd \irow0\irowband0
-\ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4788\clshdrawnil \cellx4348\clvertalt
-\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5688\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {
-\insrsid12536172\charrsid3154883 The record of nonXIP code segment creation. CodeSegFullName contains full path of the file name. If it is longer then 255 characters, the last 255 characters will be recorded.\cell }\pard\plain 
-\s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 Int(0)
-\par UInt(0)
-\par UInt(CodeSegRunAddress)
-\par UInt(CodeSegSize)
-\par Text(CodeSegFullName)\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 \trowd \irow1\irowband1
-\ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4788\clshdrawnil \cellx4348\clvertalt
-\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5688\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {
-\insrsid12536172 The record of nonXIP code segment deletion\cell }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 \f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 Int(0)
-
-\par UInt(0)
-\par UInt(CodeSegRunAddress | 1)\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 \trowd \irow2\irowband2
-\ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 
-\trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth4788\clshdrawnil \cellx4348\clvertalt
-\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5688\clshdrawnil \cellx9747\row }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {
-\insrsid12536172 Footer. Resides at the bottom of the file. 
-\par }{\insrsid481371\charrsid16604991 RowBufferErrCounter}{\insrsid481371  }{\insrsid5055728 is the number of the dropped sample records due to full buffer condition in the driver.}{\insrsid481371 
-\par }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid5055728 {\insrsid5055728\charrsid16604991 CookBufferErrCounter}{\insrsid5055728 
- is the number of the dropped code segment events due to full buffer condition in the driver.
-\par }\pard \ql \li0\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin0\pararsid12536172 {\insrsid5055728 \cell }\pard\plain \s23\ql \li284\ri0\sb60\sa60\widctlpar\intbl\wrapdefault\faauto\rin0\lin284\pararsid12536172 
-\f36\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 Int(0)
-\par UInt(0)
-\par UInt(0)
-\par UInt(}{\insrsid12536172\charrsid16604991 RowBufferErrCounter}{\insrsid12536172 )
-\par UInt(}{\insrsid12536172\charrsid16604991 CookBufferErrCounter}{\insrsid12536172 )
-\par UInt(ReportBitMask) where:
-\par   bit 0 set in }{\insrsid12536172\charrsid5403878 NonXIPMode}{\insrsid12536172 
-\par   bit 1 set if }{\insrsid12536172\charrsid5403878 NonXIPMode}{\insrsid12536172  but Kernel
-\par             hasn\rquote t got debu}{\insrsid5070621 g}{\insrsid12536172 ger support}{\insrsid12536172\charrsid5403878 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 
-\fs20\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid12536172 \trowd \irow3\irowband3\lastrow \ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 
-\trbrdrv\brdrs\brdrw10 \trftsWidth1\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 
-\cltxlrtb\clftsWidth3\clwWidth4788\clshdrawnil \cellx4348\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5688\clshdrawnil \cellx9747\row }\pard 
-\ql \li0\ri0\sb60\sa60\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid678217 {\insrsid10961137 
-\par }}
\ No newline at end of file
--- a/kerneltest/e32utils/group/base_e32utils.mrp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32utils/group/base_e32utils.mrp	Tue Jul 06 15:50:07 2010 +0300
@@ -16,7 +16,6 @@
 source	\sf\os\kernelhwsrv\kerneltest\e32utils\testusbcldd
 source	\sf\os\kernelhwsrv\kerneltest\e32utils\trace
 source	\sf\os\kernelhwsrv\kerneltest\e32utils\usbmsapp
-source	\sf\os\kernelhwsrv\kerneltest\e32utils\sdpartition	
 	
 #MattD: Reltools 2.67 don't understand 'cwtools' are the CW equivelent of 'tools' and try to do '-what cwtools udeb' instead of '-what cwtools deb'.
 #binary	\sf\os\kernelhwsrv\kerneltest\e32utils\group cwtools
@@ -26,7 +25,6 @@
 binary	\epoc32\release\tools\rel\analyse.exe
 binary	\epoc32\release\tools\rel\netcards.exe
 
--export_file	\sf\os\kernelhwsrv\kerneltest\e32utils\analyse\profiler.rtf	\epoc32\engdoc\profiler\Profiler.rtf
 notes_source	\component_defs\release.src
 
 
--- a/kerneltest/e32utils/group/bld.inf	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/e32utils/group/bld.inf	Tue Jul 06 15:50:07 2010 +0300
@@ -32,8 +32,6 @@
 
 ../profiler/profiler.h						SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(profiler.h)
 
-../analyse/profiler.rtf						/epoc32/engdoc/profiler/profiler.rtf
-
 ../d_exc/printstk.pl 						/epoc32/rom/tools/printstk.pl
 ../d_exc/printsym.pl 						/epoc32/rom/tools/printsym.pl
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/ext/t_bitproxydrive.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,305 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test\ext\bitproxydrive.cpp
+// extension to do XOR on every byte on 32 byte boundary read or written to media subsystem in same thread
+// therefore RFile::Read/Write does not have this operation carried out on it
+// 
+//
+
+#include <f32fsys.h>
+
+class CBitExtProxyDrive : public CExtProxyDrive
+	{
+public:
+	CBitExtProxyDrive(CMountCB* aMount, CExtProxyDriveFactory* aDevice);
+	~CBitExtProxyDrive();
+
+public:
+	virtual TInt Initialise();
+	virtual TInt Dismounted();
+	virtual TInt Enlarge(TInt aLength);
+	virtual TInt ReduceSize(TInt aPos, TInt aLength);
+	virtual TInt Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aThreadHandle, TInt aOffset, TInt aFlags);
+	virtual TInt Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aThreadHandle, TInt anOffset);
+	virtual TInt Read(TInt64 aPos, TInt aLength, TDes8& aTrg);
+	virtual TInt Write(TInt64 aPos, TInt aLength,const TAny* aSrc, TInt aThreadHandle, TInt aOffset, TInt aFlags);
+	virtual TInt Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aThreadHandle, TInt anOffset);
+	virtual TInt Write(TInt64 aPos,const TDesC8& aSrc);
+	virtual TInt Caps(TDes8& anInfo);
+	virtual TInt Format(TFormatInfo& aInfo);
+	virtual TInt Format(TInt64 aPos,TInt aLength);
+	virtual TInt SetInfo(const RMessage2 &msg, TAny* aMessageParam2, TAny* aMessageParam3);
+	virtual TInt NotifyChange(TDes8 &aChanged,TRequestStatus* aStatus);
+	virtual void NotifyChangeCancel();
+
+    TInt SetMountInfo(const TDesC8* aMountInfo,TInt aMountInfoThreadHandle=KCurrentThreadHandle);
+    TInt ForceRemount(TUint aFlags = 0);
+    TInt Unlock(TMediaPassword& aPassword, TBool aStorePassword);
+    TInt Lock(TMediaPassword& aOldPassword, TMediaPassword& aNewPassword, TBool aStorePassword);
+    TInt Clear(TMediaPassword& aPassword);
+    TInt ErasePassword();
+
+	TInt GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
+
+private:
+
+	TBusLocalDrive iDrive;
+	TInt iLocalDriveNumber;
+	TBool iChanged;
+
+	TRequestStatus* iNotifyChangeStatus;
+	};
+
+
+
+class CBitProxyDriveFactory : public CExtProxyDriveFactory
+	{
+public:
+	CBitProxyDriveFactory();
+	~CBitProxyDriveFactory();
+	virtual TInt Install();
+	virtual TInt CreateProxyDrive(CProxyDrive*& aMountProxyDrive,CMountCB* aMount);
+	};
+
+
+
+
+CBitExtProxyDrive::CBitExtProxyDrive(CMountCB* aMount, CExtProxyDriveFactory* aDevice)
+:   CExtProxyDrive(aMount,aDevice)
+	{
+	}
+
+CBitExtProxyDrive::~CBitExtProxyDrive()
+	{
+	iDrive.Disconnect();
+	}
+
+/**
+Initialise the proxy drive.
+@return system wide error code.
+*/
+TInt CBitExtProxyDrive::Initialise()
+	{
+	TInt r = KErrNone;
+    return r;
+	}
+
+TInt CBitExtProxyDrive::SetInfo(const RMessage2 &msg, TAny* /*aMessageParam2*/, TAny* /*aMessageParam3*/)
+    {
+	TInt r = KErrNone;
+
+    TPckg<TInt> infoPckg(iLocalDriveNumber);
+	TRAP(r, msg.ReadL(2, infoPckg));
+
+	if(r != KErrNone)
+		{
+		RDebug::Print(_L("CBitExtProxyDrive::SetInfo(): cant read from the RMessage %d"), r);
+		return r;
+		}
+
+	r = iDrive.Connect(iLocalDriveNumber, iChanged);
+
+	if(r != KErrNone)
+		{
+		RDebug::Print(_L("CBitExtProxyDrive::SetInfo(): failed to connect to drive %d, r %d"), iDriveNumber, r);
+		return r;
+		}
+
+    return r;
+    }
+
+TInt CBitExtProxyDrive::Dismounted()
+	{
+	TInt r = KErrNone;
+    return r;
+	}
+
+TInt CBitExtProxyDrive::Enlarge(TInt /*aLength*/)
+	{
+	return KErrNotSupported;
+	}
+
+
+TInt CBitExtProxyDrive::ReduceSize(TInt /*aPos*/, TInt /*aLength*/)
+	{
+	return KErrNotSupported;
+	}
+
+
+TInt CBitExtProxyDrive::Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aThreadHandle, TInt aOffset)
+	{
+	TInt r = iDrive.Read(aPos, aLength, aTrg, aThreadHandle, aOffset);
+    return r;
+	}
+
+
+TInt CBitExtProxyDrive::Read(TInt64 aPos, TInt aLength, const TAny* aTrg, TInt aThreadHandle, TInt aOffset, TInt aFlags)
+	{
+	TInt r = iDrive.Read(aPos, aLength, aTrg, aThreadHandle, aOffset, aFlags);
+    return r;
+	}
+
+TInt CBitExtProxyDrive::Read(TInt64 aPos, TInt aLength, TDes8& aTrg)
+	{
+	TInt r = iDrive.Read(aPos, aLength, aTrg);
+    return r;
+	}
+
+TInt CBitExtProxyDrive::Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aThreadHandle, TInt aOffset)
+	{
+	TInt r = iDrive.Write(aPos, aLength, aSrc, aThreadHandle, aOffset);
+    return r;
+	}
+
+
+TInt CBitExtProxyDrive::Write(TInt64 aPos, TInt aLength, const TAny* aSrc, TInt aThreadHandle, TInt aOffset, TInt aFlags)
+	{
+	TInt r = iDrive.Write(aPos, aLength, aSrc, aThreadHandle, aOffset, aFlags);
+    return r;
+	}
+
+TInt CBitExtProxyDrive::Write(TInt64 aPos,const TDesC8& aSrc)
+	{
+	TInt r = iDrive.Write(aPos, aSrc);
+    return r;
+	}
+
+
+TInt CBitExtProxyDrive::Caps(TDes8& anInfo)
+	{
+	TLocalDriveCapsV6Buf caps;
+    caps.FillZ();
+
+//    TLocalDriveCapsV6& c = caps();
+
+	TInt r = iDrive.Caps(caps);
+	caps.SetLength( Min(caps.Length(), anInfo.MaxLength()) );
+
+	anInfo.Copy(caps);
+    
+	return r;
+	}
+
+
+
+TInt CBitExtProxyDrive::Format(TInt64 aPos, TInt aLength)
+	{
+	TInt r = iDrive.Format(aPos, aLength);
+    return r;
+	}
+
+
+TInt CBitExtProxyDrive::Format(TFormatInfo& aInfo)
+	{
+	TInt r = iDrive.Format(aInfo);
+    return r;
+    }
+
+
+TInt CBitExtProxyDrive::NotifyChange(TDes8& /*aChanged*/, TRequestStatus* aStatus)
+	{
+//	iDrive.NotifyChange(aStatus);
+	iNotifyChangeStatus = aStatus;
+	return KErrNone;
+	}
+
+void CBitExtProxyDrive::NotifyChangeCancel()
+	{
+//	iDrive.NotifyChangeCancel();
+	if (iNotifyChangeStatus)
+		User::RequestComplete(iNotifyChangeStatus, KErrCancel);
+	}
+
+TInt CBitExtProxyDrive::SetMountInfo(const TDesC8* aMountInfo,TInt aMountInfoThreadHandle)
+    {
+	TInt r = iDrive.SetMountInfo(aMountInfo, aMountInfoThreadHandle);
+    return r;
+    }
+
+TInt CBitExtProxyDrive::ForceRemount(TUint aFlags)
+    {
+	TInt r = iDrive.ForceRemount(aFlags);
+    return r;
+    }
+
+TInt CBitExtProxyDrive::Unlock(TMediaPassword& aPassword, TBool aStorePassword)
+    {
+	TInt r = iDrive.Unlock(aPassword, aStorePassword);
+    return r;
+    }
+
+TInt CBitExtProxyDrive::Lock(TMediaPassword& aOldPassword, TMediaPassword& aNewPassword, TBool aStorePassword)
+    {
+	TInt r = iDrive.SetPassword(aOldPassword, aNewPassword, aStorePassword);
+    return r;
+    }
+
+TInt CBitExtProxyDrive::Clear(TMediaPassword& aPassword)
+    {
+	TInt r = iDrive.Clear(aPassword);
+    return r;
+    }
+
+TInt CBitExtProxyDrive::ErasePassword()
+    {
+	TInt r = iDrive.ErasePassword();
+    return r;
+    }
+
+TInt CBitExtProxyDrive::GetInterface(TInt aInterfaceId, TAny*& /*aInterface*/, TAny* /*aInput*/)
+	{
+	switch(aInterfaceId)
+		{
+		case ELocalBufferSupport:
+			return KErrNone;
+		default:
+			return KErrNotSupported;
+		}
+	}
+
+
+
+CBitProxyDriveFactory::CBitProxyDriveFactory()
+	{
+	}
+
+CBitProxyDriveFactory::~CBitProxyDriveFactory()
+	{
+	}
+
+TInt CBitProxyDriveFactory::Install()
+	{
+	_LIT(KProxyName,"bitproxydrive");
+	return SetName(&KProxyName);
+	}
+
+TInt CBitProxyDriveFactory::CreateProxyDrive(CProxyDrive*& aMountProxyDrive,CMountCB* aMount)
+	{
+    aMountProxyDrive = new CBitExtProxyDrive(aMount,this);
+    return (aMountProxyDrive==NULL) ? KErrNoMemory : KErrNone;
+	}
+
+
+extern "C" {
+
+
+/* 
+Create the proxy drive factory object for the usbhost mass storage proxy
+*/
+EXPORT_C CExtProxyDriveFactory* CreateFileSystem()
+	{
+	return new CBitProxyDriveFactory();
+	}
+}
+
--- a/kerneltest/f32test/group/bld.inf	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/f32test/group/bld.inf	Tue Jul 06 15:50:07 2010 +0300
@@ -33,6 +33,9 @@
 PRJ_TESTMMPFILES
 ../../e32test/mediaext/t_nfe
 
+// this should ideally be run early on as it enables 'simulated lock failure mode' in the file cache for udeb builds
+t_filecache 
+
 // These tests must be run early on so they do not time out on LFFS disks.
 
 #ifdef WINS
@@ -176,8 +179,6 @@
 t_blockmap
 #endif
 
-t_filecache 
-
 t_fsched
 t_rcache
 t_wcache
@@ -262,6 +263,8 @@
 
 t_localtime 
 
+t_dircache
+
 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
 t_file64bit manual
 fhserver64bit       support
@@ -274,3 +277,5 @@
 t_cp932dll      support
 t_cp_plugin
 
+t_bitproxydrive    support
+t_proxydrive1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/group/t_bitproxydrive.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,33 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test/group/t_bitext.mmp
+// 
+//
+
+TARGET			t_bitproxydrive.pxy
+TARGETTYPE		fsy
+
+SOURCEPATH		../ext
+SOURCE			t_bitproxydrive.cpp
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+LIBRARY			euser.lib efile.lib
+
+UID		0x100039df 0x10000CEE
+VENDORID 0x70000001
+
+#include "../../../userlibandfileserver/fileserver/group/f32caps.mmh"  // Capabilities of File Server process
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/group/t_dircache.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,34 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test/group/t_dircache.mmp
+//
+//
+
+target		t_dircache.exe
+targettype	exe
+sourcepath	../server
+source		t_main.cpp t_dircache.cpp
+sourcepath	../fileutils/src
+source 		t_chlffs.cpp f32_test_utils.cpp fat_utils.cpp
+
+library		euser.lib efsrv.lib hal.lib efile.lib
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+USERINCLUDE 	../server
+userinclude     ../fileutils/inc
+epocstacksize	0x4000
+capability		tcb diskadmin allfiles
+vendorid		0x70000001
+
+SMPSAFE
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/group/t_proxydrive1.mmp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,35 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test/group/t_proxydrive1.mmp
+// 
+//
+
+TARGET         t_proxydrive1.exe        
+TARGETTYPE     EXE
+SOURCEPATH	../server
+SOURCE         t_proxydrive1.cpp
+SOURCE         t_main.cpp
+SOURCEPATH     ../fileutils/src
+SOURCE         t_chlffs.cpp f32_test_utils.cpp
+
+
+LIBRARY        euser.lib efsrv.lib hal.lib
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+USERINCLUDE    ../server
+USERINCLUDE    ../fileutils/inc
+
+CAPABILITY		TCB DISKADMIN ALLFILES
+VENDORID 0x70000001
+
+SMPSAFE
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_dircache.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,612 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test\server\t_dircache.cpp
+// 
+//
+#define __E32TEST_EXTENSION__
+#include <f32file.h>
+#include <f32fsys.h>
+#include <e32test.h>
+#include <f32dbg.h>
+#include "t_server.h"
+#include "t_chlffs.h"
+#include "f32_test_utils.h"
+#include "fat_utils.h"
+#include "d_pagestress.h"
+
+RTest test(_L("T_DIRCACHE"));
+
+/*
+ * This whole test execute on UDEB mode only.
+ */
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+
+TInt gDrive=-1;
+const TInt32 KDef_KLeafDirCacheSize = 32;                    // default leaf dir cache number
+const TInt32 KDef_DynamicDirCacheMinInBytes = 128 << 10;     // default minimum fat dir cache size in bytes
+const TInt32 KDef_DynamicDirCacheMaxInBytes = 256 << 10;     // default maximum fat dir cache size in bytes
+const TInt32 KDef_MaxDynamicDirCachePageSzLog2 = 14;         // default value for directory cache single page 
+                                                              //  maximal size Log2, 2^14 (16K) by default
+const TInt32 KMaxThreadCount = 1;                            // the maximum number of multiple threads that can
+                                                              //  access dir cache concurrently.
+const TInt32 KSegmentSize = 1 << 12;                            // the smallest memory unit that Kernel manages  
+
+template <class C>
+TInt controlIo(RFs &fs, TInt drv, TInt fkn, C &c)
+    {
+    TPtr8 ptrC((TUint8 *)&c, sizeof(C), sizeof(C));
+
+    TInt r = fs.ControlIo(drv, fkn, ptrC);
+
+    return r;
+    }
+
+// See f32\sfile\sf_memory_man.cpp for the default value settings
+const TInt  KDefaultGlobalCacheMemorySize = (8 << 10) << 10;
+const TInt  KDefaultLowMemoryThreshold = 10;
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID      PBASE-XXXX 
+//@SYMTestType        FT
+//@SYMPREQ            PREQ1885
+//@SYMTestCaseDesc    Check global cache settings. The global cache should be either:
+//                      1. 0 (disabled)
+//                      2. no less than the sum of all per-drive settings
+//----------------------------------------------------------------------------------------------
+void TestGlobalSettings()
+    {
+    test.Next(_L("Test global cache settings"));
+    // read global cache settings from estart.txt
+    TGlobalCacheConfig globalCacheConfig;
+    TInt r = controlIo(TheFs,gDrive, KControlIoGlobalCacheConfig, globalCacheConfig);
+	test_KErrNone(r);
+    test_Value (globalCacheConfig.iGlobalCacheSizeInBytes,
+				globalCacheConfig.iGlobalCacheSizeInBytes > 0 || globalCacheConfig.iGlobalCacheSizeInBytes == KErrNotFound);
+    test_Value (globalCacheConfig.iGlobalLowMemoryThreshold,
+				globalCacheConfig.iGlobalLowMemoryThreshold >= 0 || globalCacheConfig.iGlobalLowMemoryThreshold == KErrNotFound);
+
+    const TInt32 globalCacheSize = globalCacheConfig.iGlobalCacheSizeInBytes > 0 ? 
+                                       globalCacheConfig.iGlobalCacheSizeInBytes : KDefaultGlobalCacheMemorySize;
+
+    // test if global cache is enabled, it is configured in the way that its figure is no less
+    //  than the sum of per-drive max size settings (taking default values into account). 
+    TInt32 sumDirCacheMaxSize = 0;
+    for (TInt i = 0; i < KMaxDrives; i++)
+        {
+        TBuf<0x20>  fsName;
+        r = TheFs.FileSystemName(fsName, i);
+
+        if (r == KErrNone && (F32_Test_Utils::Is_Fat(TheFs, i) || F32_Test_Utils::Is_ExFat(TheFs, i)))
+            {
+            test.Printf(_L("drive[%C:] file system: (\"%S\")\n"), 'A' + i, &fsName);
+            TDirCacheConfig dirCacheConfig;
+            r = controlIo(TheFs,gDrive, KControlIoDirCacheConfig, dirCacheConfig);
+            test_KErrNone(r);
+            if(dirCacheConfig.iDirCacheSizeMax > 0)
+                {
+                sumDirCacheMaxSize += (dirCacheConfig.iDirCacheSizeMax > KDef_DynamicDirCacheMaxInBytes ? dirCacheConfig.iDirCacheSizeMax : KDef_DynamicDirCacheMaxInBytes);
+                }
+            else
+                {
+                sumDirCacheMaxSize += KDef_DynamicDirCacheMaxInBytes;
+                }
+            test.Printf(_L("++sumDirCacheMaxSize = %d\n"), sumDirCacheMaxSize);
+            }
+        }
+    test_Compare(globalCacheSize, >=, sumDirCacheMaxSize);
+    }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID      PBASE-XXXX 
+//@SYMTestType        FT
+//@SYMPREQ            PREQ1885
+//@SYMTestCaseDesc    Test current drive's dir cache configurations, the current dir cache info should
+//                      match the configurations read from estart.txt file.
+//----------------------------------------------------------------------------------------------
+void TestDirCacheSettings()
+    {
+    test.Next(_L("Test current drive's dir cache settings"));
+    
+    // test global cache config is ON 
+    TGlobalCacheConfig globalCacheConfig;
+    TInt r = controlIo(TheFs,gDrive, KControlIoGlobalCacheConfig, globalCacheConfig);
+    test_KErrNone(r);
+    test_Value (globalCacheConfig.iGlobalCacheSizeInBytes,
+				globalCacheConfig.iGlobalCacheSizeInBytes > 0 || globalCacheConfig.iGlobalCacheSizeInBytes == KErrNotFound);
+    test_Value (globalCacheConfig.iGlobalLowMemoryThreshold,
+				globalCacheConfig.iGlobalLowMemoryThreshold >= 0 || globalCacheConfig.iGlobalLowMemoryThreshold == KErrNotFound);
+    
+    // test global cache info is corresponding to the configurations
+    TGlobalCacheInfo globalCacheInfo;
+    r = controlIo(TheFs,gDrive, KControlIoGlobalCacheInfo, globalCacheInfo);
+    test_KErrNone(r);
+
+    if (globalCacheConfig.iGlobalCacheSizeInBytes == KErrNotFound)
+        {
+        test_Equal(KDefaultGlobalCacheMemorySize, globalCacheInfo.iGlobalCacheSizeInBytes);
+        }
+    else
+        {
+        test_Equal(globalCacheConfig.iGlobalCacheSizeInBytes, globalCacheInfo.iGlobalCacheSizeInBytes);
+        }
+
+    if (globalCacheConfig.iGlobalLowMemoryThreshold == KErrNotFound)
+        {
+        test_Equal(KDefaultLowMemoryThreshold, globalCacheInfo.iGlobalLowMemoryThreshold);
+        }
+    else
+        {
+        test_Equal(globalCacheConfig.iGlobalLowMemoryThreshold, globalCacheInfo.iGlobalLowMemoryThreshold);
+        }
+    
+    // read per-drive settings from estart.txt
+    TDirCacheConfig dirCacheConfig;
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheConfig, dirCacheConfig);
+    test_KErrNone(r);
+    test_Value (dirCacheConfig.iLeafDirCacheSize,
+				dirCacheConfig.iLeafDirCacheSize >= 0 || dirCacheConfig.iLeafDirCacheSize == KErrNotFound);
+    test_Value (dirCacheConfig.iDirCacheSizeMin,
+				dirCacheConfig.iDirCacheSizeMin >= 0 || dirCacheConfig.iDirCacheSizeMin == KErrNotFound);
+    test_Value (dirCacheConfig.iDirCacheSizeMax,
+				dirCacheConfig.iDirCacheSizeMax >= 0 || dirCacheConfig.iDirCacheSizeMax == KErrNotFound);
+    
+    // caculate expected settings according to the readings from estart.txt
+    if (dirCacheConfig.iLeafDirCacheSize == 0)
+        dirCacheConfig.iLeafDirCacheSize = 1;
+    if (dirCacheConfig.iLeafDirCacheSize == KErrNotFound)
+        dirCacheConfig.iLeafDirCacheSize = KDef_KLeafDirCacheSize;
+    if (dirCacheConfig.iDirCacheSizeMin < KDef_DynamicDirCacheMinInBytes)
+        dirCacheConfig.iDirCacheSizeMin = KDef_DynamicDirCacheMinInBytes;
+    if (dirCacheConfig.iDirCacheSizeMax < KDef_DynamicDirCacheMaxInBytes)
+        dirCacheConfig.iDirCacheSizeMax = KDef_DynamicDirCacheMaxInBytes;
+    
+    TVolumeIOParamInfo ioParam;
+    r = TheFs.VolumeIOParam(gDrive, ioParam);
+    test_KErrNone(r);
+    const TInt32 KClusterSize = ioParam.iClusterSize;
+    test.Printf(_L("DRV[%C:] cluster = %d\n"), gDrive + 'A', ioParam.iClusterSize); 
+
+    const TInt32 KDefMaxCachePageSize = 1 << KDef_MaxDynamicDirCachePageSzLog2;
+    const TInt32 KPageSizeInData = KClusterSize < KDefMaxCachePageSize ? KClusterSize : KDefMaxCachePageSize;
+    const TInt32 KPageSizeInMem = KPageSizeInData < KSegmentSize ? KSegmentSize : KPageSizeInData;
+    const TInt32 KCacheSizeMinInPages = dirCacheConfig.iDirCacheSizeMin / KPageSizeInMem;
+    const TInt32 KCacheSizeMaxInPages = dirCacheConfig.iDirCacheSizeMax / KPageSizeInMem;
+    const TInt32 KUnlockedPageNum = 0;
+    
+    // remount drive, get current dir cache info and test
+    r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+    test_KErrNone(r);
+
+    TDirCacheInfo dirCacheInfo;
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+    
+    test_Equal(KSegmentSize, dirCacheInfo.iMemorySegmentSize);
+    test_Equal(KPageSizeInMem, dirCacheInfo.iPageSizeInMemory);
+    test_Equal(KPageSizeInData, dirCacheInfo.iPageSizeInData);
+    test_Equal(KCacheSizeMinInPages, dirCacheInfo.iMinCacheSizeInPages);
+    test_Equal(KCacheSizeMaxInPages, dirCacheInfo.iMaxCacheSizeInPages);
+    test_Equal(KMaxThreadCount, dirCacheInfo.iLockedPageNumber);
+    test_Equal(KUnlockedPageNum, dirCacheInfo.iUnlockedPageNumber);
+    }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID      PBASE-XXXX 
+//@SYMTestType        FT
+//@SYMPREQ            PREQ1885
+//@SYMTestCaseDesc    Test populating dir cache under normal memory conditions.
+//----------------------------------------------------------------------------------------------
+void TestPopulateCache()
+    {
+    test.Next(_L("Test populating dir cache under normal memory conditions"));
+    
+    CFileMan* fileMan = CFileMan::NewL(TheFs);
+    test_NotNull(fileMan);
+    TInt r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_Value(r, r==KErrNone || r==KErrPathNotFound);
+
+    // remount drive, get current dir cache info
+    r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+    test_KErrNone(r);
+
+    /*
+     * Test populating dir cache 
+     */
+    TVolumeIOParamInfo ioParam;
+    r = TheFs.VolumeIOParam(gDrive, ioParam);
+    test_KErrNone(r);
+    const TInt32 KClusterSize = ioParam.iClusterSize;
+
+    TFileName dirPath = _L("\\TEST_DIRCACHE\\");
+    r = TheFs.MkDirAll(dirPath);
+    test_KErrNone(r);
+
+    TDirCacheInfo dirCacheInfo;
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    // this calculation is for volumes that have a large cluster size, larger than the allowed maximum
+    //  page size. on this case, creating a new directory will generate two or more new pages in the 
+    //  dir cache 
+    const TUint pagesPerDir = KClusterSize > dirCacheInfo.iPageSizeInMemory ? 
+                            KClusterSize / dirCacheInfo.iPageSizeInMemory : 1;
+    
+    // should be KMaxThreadCount + root dir (1 page) + "\\TEST_DIRCACHE\\" (number of pages that are 
+    //  needed for new directories, i.e. pagesPerDir)
+    test_Equal(KMaxThreadCount + 1 + pagesPerDir, dirCacheInfo.iLockedPageNumber);
+
+    const TInt initialUnlockedPage = dirCacheInfo.iUnlockedPageNumber;
+
+    const TInt createdNewDirs = dirCacheInfo.iMinCacheSizeInPages - dirCacheInfo.iLockedPageNumber;
+    // create directories so that it grows to KCacheSizeMinInPages
+    for (TInt i = 1; i <= createdNewDirs; i++)
+        {
+        dirPath = _L("\\TEST_DIRCACHE\\");
+        TFileName dirName;
+        dirName.Format(_L("DIR%d\\"), i);
+        dirPath += dirName;
+        r = TheFs.MkDirAll(dirPath);
+        test_KErrNone(r);
+        }
+    
+    const TInt KFatDirEntrySize = 32;
+    const TInt subDirNum = dirCacheInfo.iMinCacheSizeInPages - dirCacheInfo.iLockedPageNumber;
+    // calculate the extra pages needed for the newly created sub dir entries (plus the original 
+    //  "." and ".." entries)
+    TInt extraPagesForLeafdir = ((subDirNum + 2) * KFatDirEntrySize / dirCacheInfo.iPageSizeInData) - 1;
+    if (((subDirNum + 2) * KFatDirEntrySize) % dirCacheInfo.iPageSizeInData > 0)
+        extraPagesForLeafdir++;
+    test.Printf(_L("!!Extra pages needed for leafdir = %d\n"), extraPagesForLeafdir);   //kk
+
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+    r = controlIo(TheFs,gDrive, 15, dirCacheInfo);
+    test_KErrNone(r);
+
+    test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+    
+    const TInt maxUnlockedPage = dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages;
+    // calculating the expected unlocked page number here.
+    TInt newUnlockedPage = initialUnlockedPage;
+    newUnlockedPage += extraPagesForLeafdir;                // if any extra pages are created for the leafdir
+    newUnlockedPage += createdNewDirs * (pagesPerDir - 1);   // if more than one page is needed for each dir creation 
+    test_Equal((newUnlockedPage > maxUnlockedPage ? maxUnlockedPage : newUnlockedPage), dirCacheInfo.iUnlockedPageNumber);
+
+    // create directories so that it grows to KCacheSizeMinInPages + KCacheSizeMaxInPages
+    if (dirCacheInfo.iMaxCacheSizeInPages > dirCacheInfo.iMinCacheSizeInPages)
+        {
+        for (TInt i = 1; i <= dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages; i++)
+            {
+            dirPath = _L("\\TEST_DIRCACHE\\");
+            TFileName dirName;
+            dirName.Format(_L("DIR_UNLOCKED%d\\"), i);
+            dirPath += dirName;
+            r = TheFs.MkDirAll(dirPath);
+            test_KErrNone(r);
+            }
+        r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+        test_KErrNone(r);
+        r = controlIo(TheFs,gDrive, 15, dirCacheInfo);
+        test_KErrNone(r);
+
+        test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+        
+        test_Equal(dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iUnlockedPageNumber);
+        }
+    
+    // create more directories and check that dir cache doesn't grow beyond KCacheSizeMaxInPages
+    for (TInt j = 1; j <= dirCacheInfo.iMinCacheSizeInPages; j++)
+        {
+        dirPath = _L("\\TEST_DIRCACHE\\");
+        TFileName dirName;
+        dirName.Format(_L("DIR_MORE%d\\"), j);
+        dirPath += dirName;
+        r = TheFs.MkDirAll(dirPath);
+        test_KErrNone(r);
+        }
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+    r = controlIo(TheFs,gDrive, 15, dirCacheInfo);
+    test_KErrNone(r);
+
+    test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+    test_Equal(dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iUnlockedPageNumber);
+
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_KErrNone(r);
+    
+    delete fileMan;
+    }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID      PBASE-XXXX 
+//@SYMTestType        FT
+//@SYMPREQ            PREQ1885
+//@SYMTestCaseDesc    Test simulating low memory condition.
+//                    1. The cache should stop growing when it is at its minimum cache size in pages
+//                    2. The cache should function properly when it stops simulating low memory condition 
+//----------------------------------------------------------------------------------------------
+void TestSimulatingLowMemory()
+    {
+    // remount drive, get current dir cache info and test
+    test.Next(_L("Test dir cache growth when simulating low memory condition"));
+
+    CFileMan* fileMan = CFileMan::NewL(TheFs);
+    test(fileMan != NULL);
+    TInt r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_Value(r, r==KErrNone || r==KErrPathNotFound);
+
+    r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+    test_KErrNone(r);
+
+    r = TheFs.ControlIo(gDrive, KControlIoSimulateMemoryLow);
+    test_KErrNone(r);
+
+    /*
+     * Test populating dir cache 
+     */
+    TFileName dirPath = _L("\\TEST_DIRCACHE\\");
+    r = TheFs.MkDirAll(dirPath);
+    test_KErrNone(r);
+
+    TDirCacheInfo dirCacheInfo;
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    // create directories so that it grows to KCacheSizeMaxInPages
+    for (TInt i = 1; i <= dirCacheInfo.iMaxCacheSizeInPages; i++)
+        {
+        dirPath = _L("\\TEST_DIRCACHE\\");
+        TFileName dirName;
+        dirName.Format(_L("DIR%d\\"), i);
+        dirPath += dirName;
+        r = TheFs.MkDirAll(dirPath);
+        test_KErrNone(r);
+        }
+
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+    test_Equal(0, dirCacheInfo.iUnlockedPageNumber);
+    
+    r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_KErrNone(r);
+ 
+    // test when stop simulating the low memory condition, cache grows normally
+    test.Next(_L("Test dir cache growth when stop simulating low memory condition"));
+    r = TheFs.ControlIo(gDrive, KControlIoStopSimulateMemoryLow);
+    test_KErrNone(r);
+
+    r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+    test_KErrNone(r);
+
+    /*
+     * Test populating dir cache 
+     */
+    dirPath = _L("\\TEST_DIRCACHE\\");
+    r = TheFs.MkDirAll(dirPath);
+    test_KErrNone(r);
+
+    // create directories so that it grows to KCacheSizeMaxInPages
+    for (TInt j = 1; j <= dirCacheInfo.iMaxCacheSizeInPages; j++)
+        {
+        dirPath = _L("\\TEST_DIRCACHE\\");
+        TFileName dirName;
+        dirName.Format(_L("DIR%d\\"), j);
+        dirPath += dirName;
+        r = TheFs.MkDirAll(dirPath);
+        test_KErrNone(r);
+        }
+
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+    test_Equal(dirCacheInfo.iMaxCacheSizeInPages - dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iUnlockedPageNumber);
+    
+    r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_KErrNone(r);
+
+    delete fileMan;
+    }
+
+//----------------------------------------------------------------------------------------------
+//@SYMTestCaseID      PBASE-XXXX 
+//@SYMTestType        FT
+//@SYMPREQ            PREQ1885
+//@SYMTestCaseDesc    Test low memory threshold on hardware platforms
+//                    1. Stress the system memory to below the low memory threshold configured
+//                    2. The cache should stop growing when it is at its minimum cache size in pages
+//                    3. Resume the system memory before step 1.
+//                    2. The cache should function properly when it stops simulating low memory condition 
+//----------------------------------------------------------------------------------------------
+void TestLowMemoryHW()
+    {
+    test.Next(_L("Test low memory threshold on hardware"));
+#if !defined(__WINS__)
+
+    CFileMan* fileMan = CFileMan::NewL(TheFs);
+    test_NotNull(fileMan);
+    TInt r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_Value(r, r==KErrNone || r==KErrPathNotFound);
+
+    r = F32_Test_Utils::RemountFS (TheFs, CurrentDrive(), NULL);
+    test_KErrNone(r);
+
+    RPageStressTestLdd PagestressLdd;
+    TMemoryInfoV1Buf memInfo;
+    r = UserHal::MemoryInfo(memInfo);
+    test_KErrNone(r);
+
+    TGlobalCacheInfo globalCacheInfo;
+    r = controlIo(TheFs,gDrive, KControlIoGlobalCacheInfo, globalCacheInfo);
+    test_KErrNone(r);
+
+    test.Printf(_L("Free RAM before setup %d\n"), memInfo().iFreeRamInBytes);
+    const TReal lowMemThreshold = globalCacheInfo.iGlobalLowMemoryThreshold / 200.00;
+    test.Printf(_L("Low memory threshold = %d%%\n"), globalCacheInfo.iGlobalLowMemoryThreshold);
+    test.Printf(_L("Current memory available = %d%%\n"), lowMemThreshold * 100);
+
+    const TInt totalRamInBytes = memInfo().iTotalRamInBytes;
+    const TInt setupFreeRamInBytes = (TInt) (lowMemThreshold * totalRamInBytes);
+    const TInt setupFreeRamInPages = setupFreeRamInBytes / KSegmentSize;
+    
+    r = User::LoadLogicalDevice(KPageStressTestLddName);
+    test_Value(r, r==KErrNone || r==KErrAlreadyExists);
+    r = PagestressLdd.Open();
+    test_KErrNone(r);
+    r = PagestressLdd.DoSetDebugFlag((TInt)ETrue);
+    test_KErrNone(r);
+    if (setupFreeRamInPages > 0 && setupFreeRamInBytes < totalRamInBytes)
+        {
+        r = PagestressLdd.DoConsumeRamSetup(setupFreeRamInPages, 1);
+        test_KErrNone(r);
+        r = UserHal::MemoryInfo(memInfo);
+        test_KErrNone(r);
+        test.Printf(_L("Free RAM after setup %d\n"), memInfo().iFreeRamInBytes);
+        }
+    else
+        {
+        test.Printf(_L("Current memory is already low: %d\n"), memInfo().iFreeRamInBytes);
+        }
+
+    /*
+     * Test populating dir cache 
+     */
+    TFileName dirPath = _L("\\TEST_DIRCACHE\\");
+    r = TheFs.MkDirAll(dirPath);
+    test_KErrNone(r);
+
+    TDirCacheInfo dirCacheInfo;
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    // create directories so that it grows to KCacheSizeMaxInPages
+    for (TInt i = 1; i <= dirCacheInfo.iMaxCacheSizeInPages; i++)
+        {
+        dirPath = _L("\\TEST_DIRCACHE\\");
+        TFileName dirName;
+        dirName.Format(_L("DIR%d\\"), i);
+        dirPath += dirName;
+        r = TheFs.MkDirAll(dirPath);
+        test_KErrNone(r);
+        }
+
+    r = controlIo(TheFs,gDrive, KControlIoDirCacheInfo, dirCacheInfo);
+    test_KErrNone(r);
+
+    test_Equal(dirCacheInfo.iMinCacheSizeInPages, dirCacheInfo.iLockedPageNumber);
+    test_Equal(0, dirCacheInfo.iUnlockedPageNumber);
+    
+    // release memory
+    PagestressLdd.DoConsumeRamFinish();
+    PagestressLdd.Close();
+    r = User::FreeLogicalDevice(KPageStressTestLddName);
+    test_KErrNone(r);
+    
+    r = UserHal::MemoryInfo(memInfo);
+    test_KErrNone(r);
+    test.Printf(_L("Free RAM after test %d\n"), memInfo().iFreeRamInBytes);
+
+    r = fileMan->RmDir(_L("\\TEST_DIRCACHE\\"));
+    test_KErrNone(r);
+    delete fileMan;
+#else
+    test.Printf(_L("This test step only runs on hardware!!\n"));
+#endif //#if !defined(__WINS__)
+    }
+
+#endif // #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+
+GLDEF_C void CallTestsL()
+//
+// Test the file server.
+//
+    {
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+    TInt nRes=TheFs.CharToDrive(gDriveToTest, gDrive);
+    test_KErrNone(nRes);
+
+    TDriveInfo  driveInfo;
+    nRes = TheFs.Drive(driveInfo, gDrive);
+    test.Printf(_L("MediaType: 0x%x\n"), driveInfo.iType);
+    test_KErrNone(nRes);
+    
+    if (F32_Test_Utils::Is_Fat(TheFs, gDrive) && driveInfo.iType != EMediaRam)
+        {
+        nRes = F32_Test_Utils::FormatDrive(TheFs, gDrive, ETrue);
+        test_KErrNone(nRes);
+        
+        F32_Test_Utils::PrintDrvInfo(TheFs, gDrive);
+        
+        TVolumeInfo v;
+        TInt r=TheFs.Volume(v, CurrentDrive());
+        test_KErrNone(r);
+        
+        CreateTestDirectory(_L("\\F32-TST\\TDIRCACHE\\"));
+        
+        TestGlobalSettings();
+        TestDirCacheSettings();
+        TestPopulateCache();
+        TestSimulatingLowMemory();
+        TestLowMemoryHW();
+        
+        DeleteTestDirectory();
+        }
+    else
+        {
+        test.Printf(_L("This test executes on FAT drives and non-RAM media only!!\n"));
+        }
+#else
+    test.Printf(_L("This test executes on DEBUG mode only!!\n"));
+#endif //#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+    }
+
+/*
+void TestReadEstart()
+    {
+    TDirCacheConfig dirCacheConfig;
+    TInt r = controlIo(TheFs,gDrive, KControlIoDirCacheConfig, dirCacheConfig);
+    test_KErrNone(r);
+    test.Printf(_L("Dir cache: \n Drive %C \n iLeafDirCacheSize %d \n iDirCacheSizeMin %d \n iDirCacheSizeMax %d \n iGlobalCacheMemorySize %d \n iLowMemoryThreshold %%%d"), 
+            dirCacheConfig.iDrive + 'A',
+            dirCacheConfig.iLeafDirCacheSize,
+            dirCacheConfig.iDirCacheSizeMin,
+            dirCacheConfig.iDirCacheSizeMax);
+    }
+
+*/
+
+//          const TInt KControlIoGlobalCacheConfig=KMaxTInt-21;
+//          const TInt KControlIoGlobalCacheInfo=KMaxTInt-22;
+//          const TInt KControlIoDirCacheConfig=KMaxTInt-23;
+//          const TInt KControlIoDirCacheInfo=KMaxTInt-24;
+//
+//class TGlobalCacheConfig
+//class TGlobalCacheInfo
+//class TDirCacheConfig
+//class TDirCacheInfo 
+
+//  this test is for FAT only!!
+//if (F32_Test_Utils::Is_ExFat(TheFs, gDrive))
+//    {
+//    // test cluster size
+//    TVolumeIOParamInfo ioParam;
+//    TInt r = TheFs.VolumeIOParam(gDrive, ioParam);
+//    test.Printf(_L("TheFs.VolumeIOParam for EXFAT: (cluster = %d) = %d\n"), ioParam.iClusterSize, r); 
+//    }
+//
--- a/kerneltest/f32test/server/t_filecache.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/kerneltest/f32test/server/t_filecache.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -321,11 +321,24 @@
 
 	test.Printf(_L("Writing to file..."));
 
-	r = f.Write(pos, writePtr);
-	test_KErrNone(r);
+	// now we have gobbled all or most of memory, the next write can fail
+	// if it does keep decommitting memory until it succeeds and then test that the file size is correct
+	commitEnd = 0;
+	do {
+
+		r = f.Write(pos, writePtr);
+		test_Value(r, r == KErrNoMemory || r == KErrNone);
+		if (r == KErrNoMemory)
+			{
+			chunk.Decommit(commitEnd,KPageSize);
+			commitEnd += KPageSize;
+			}
+		}
+	while (r == KErrNoMemory);
+
 	pos+= writePtr.Length();
 
-	test.Printf(_L("Setting size of file ..."));
+	test.Printf(_L("Gsetting size of file ..."));
 	r = f.Size(fileSize);
 	test_KErrNone(r);
 	test_Equal(fileSize,pos);
@@ -549,6 +562,9 @@
 	r = f.Replace(TheFs, testFile, EFileReadBuffered | EFileWrite | EFileWriteBuffered);
 	test_KErrNone(r);
 
+	r = f.SetSize(gFileCacheConfig.iCacheSize);
+	test_KErrNone(r);
+
 	RTimer timer;
 	timer.CreateLocal();
 	TRequestStatus reqStat;
@@ -1888,6 +1904,10 @@
 //TheFs.SetDebugRegister(KCACHE);
 			DoTests(gDrive);
 //TheFs.SetDebugRegister(0);
+
+		if ((gVolInfo.iDrive.iMediaAtt & KMediaAttFormattable))
+			Format(gDrive);
+
 			test.End();
 //			}
 		}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_proxydrive1.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -0,0 +1,169 @@
+// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test\ext\t_ext1.cpp
+// 
+//
+
+#include <f32file.h>
+#include <e32test.h>
+#include <e32svr.h>
+#include "t_server.h"
+#include "f32_test_utils.h"
+
+using namespace F32_Test_Utils;
+
+
+GLDEF_D RTest test(_L("T_PROXYDRIVE1"));
+
+
+TInt GetRemovableDrive(TInt aDriveNumber)
+	{
+	RLocalDrive d;
+	TBool flag=EFalse;
+
+	//Find the local drive number corresponding to aDriveNumber
+	TMediaSerialNumber serialNum;
+	TInt r = TheFs.GetMediaSerialNumber(serialNum, aDriveNumber);
+	if(r!= KErrNone)
+		return r;
+
+	TInt len = serialNum.Length();
+	test.Printf(_L("Serial number (len %d) :\n"), len);
+
+	for (TInt n=0; n<KMaxLocalDrives; n++)
+		{
+		r = d.Connect(n, flag);
+		if(r != KErrNone)
+			{
+			test.Printf(_L("drive %d: TBusLocalDrive::Connect() failed %d\n"), n, r);
+			continue;
+			}
+
+	    TLocalDriveCapsV5Buf capsBuf;
+	    TLocalDriveCapsV5& caps = capsBuf();
+		r = d.Caps(capsBuf);
+		if(r != KErrNone)
+			{
+			test.Printf(_L("drive %d: TBusLocalDrive::Caps() failed %d\n"), n, r);
+			continue;
+			}
+
+		if ((caps.iDriveAtt & KDriveAttRemovable) == 0)
+			{
+			continue;
+			}
+
+		TPtrC8 localSerialNum(caps.iSerialNum, caps.iSerialNumLength);
+		if (serialNum.Compare(localSerialNum) == 0)
+			{
+			d.Close();
+			test.Printf(_L("found removable drive: local drive number %d\n"), n);
+			return n;
+			}
+
+		d.Close();
+		}
+
+	return KErrNotFound;
+	}
+
+
+
+
+GLDEF_C void CallTestsL()
+	{
+    TInt drive;
+	TInt err=RFs::CharToDrive(gDriveToTest,drive);
+	test.Start(_L("Starting Test - T_PROXYDRIVE1"));
+	test(err==KErrNone);
+
+    PrintDrvInfo(TheFs, drive);
+
+
+	_LIT(KBitProxyDriveName, "t_bitproxydrive.pxy");
+	_LIT(KBitProxyDrive, "bitproxydrive");
+
+	TInt r;
+
+	TInt localDriveNumber = GetRemovableDrive(drive);
+	if (localDriveNumber < 0)
+		{
+		test.Printf(_L("Not a removable drive, skipping test\n"));
+		return;
+		}
+
+
+	test.Next(_L("Adding and then removing a proxy drive with an open subsession"));
+	r = TheFs.AddProxyDrive(KBitProxyDriveName);
+	test.Printf(_L("AddProxyDrive(%S) r %d\n"), &KBitProxyDriveName, r);
+	test(r == KErrNone || r == KErrAlreadyExists);
+
+	TPckgBuf<TInt> p1; p1() = localDriveNumber;
+	TBuf<1> p2;
+	TInt driveNumber = EDriveM;
+
+	r = TheFs.MountProxyDrive(driveNumber, KBitProxyDrive, &p1, &p2);
+	test.Printf(_L("MountProxyDrive(%d, %S) r %d\n"), driveNumber, &KBitProxyDrive, r);
+	test (r >= 0);
+
+	_LIT(KFileSystem, "FAT");
+	r = TheFs.MountFileSystem(KFileSystem, driveNumber);
+	test.Printf(_L("MountFileSystem(%S) r %d\n"), &KFileSystem, r);
+	test(r == KErrNone);
+
+
+	RFs fs;
+	r = fs.Connect();
+	test(r == KErrNone);
+
+
+	TPath dirPath = _L("?:\\*");
+	dirPath[0] = (TUint8) ('A' + driveNumber);
+	RDir dir;
+	r = dir.Open(fs, dirPath, KEntryAttNormal);
+	test.Printf(_L("RDir::Open(%S) r %d\n"), &dirPath, r);
+
+
+	r = TheFs.DismountFileSystem(KFileSystem, driveNumber);
+	test.Printf(_L("DismountFileSystem(%S) r %d\n"), &KFileSystem, r);
+	test (r == KErrInUse);
+
+	// dismount failed - attempt a forced dismount
+	TRequestStatus stat;
+	TheFs.NotifyDismount(driveNumber, stat, EFsDismountForceDismount);
+	User::WaitForRequest(stat);
+	r = stat.Int();
+	test.Printf(_L("DismountFileSystem(%S, EFsDismountForceDismount) r %d\n"), &KFileSystem, r);
+	test (r == KErrNone);
+
+	r = TheFs.DismountProxyDrive(driveNumber);
+	test.Printf(_L("DismountProxyDrive(%d) r %d\n"), driveNumber, r);
+	test (r == KErrNone);
+
+	test.Printf(_L("Calling RemoveProxyDrive()...\n"));
+	r = TheFs.RemoveProxyDrive(KBitProxyDrive);
+	test.Printf(_L("RemoveProxyDrive() r %d\n"), r);
+	test (r == KErrNone);
+	User::After(1000000);
+
+	test.Printf(_L("closing dir (%S)....\n"), &dirPath, r);
+	dir.Close();
+
+	test.Printf(_L("closing file session()....\n"));
+	fs.Close();
+
+
+	test.End();
+	test.Close();
+	}
--- a/userlibandfileserver/fileserver/etshell/ts_com.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/etshell/ts_com.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -31,9 +31,13 @@
 #include <nkern/nk_trace.h>
 #include "filesystem_fat.h"
 
+_LIT(KCrNl, "\r\n");
+_LIT(KNl, "\n");
+
     TPtrC ptrFormatHelp=_L("Drive:[\\] [fat12|fat16|fat32] [spc:X] [rs:Y] [ft:Z] [/Q][/S][/E][/F]\nfat12 or fat16 or fat32 specifies explicit FAT type\nspc:X specifies \"X\" sectors per cluster\nrs:Y specifies \"Y\" reserved sectors\nft:Z specifies \"Z\" FAT tables (1 or 2)\n\n/q - QuickFormat, /s - SpecialFormat, /e - ForcedErase\n/f - force formatting (ignore volume being in use)");
-    TPtrC ptrMountHelp=_L("Drive:[\\]  <fsy:X> <fs:Y> [pext:Z] [/S][/U][/F][/R]\n'X' *.fsy module name, like elocal.fsy\n'Y' file system name, like 'FAT'\n'Z' optional primary extension module name\n/U - dismount FS from the drive e.g 'mount d: /u' \n/F - force mounting with dismounting existing FS \n/S - mount drive as synchronous\n/R - remount the file system ");
-
+TPtrC ptrMountHelp=_L("Drive:[\\]  <fsy:X> <fs:Y> [pext:Z] [/S][/U][/F][/R]\n'X' *.fsy module name, like elocal.fsy\n'Y' file system name, like 'FAT'\n'Z' optional primary extension module name\n/U - dismount FS from the drive e.g 'mount d: /u' \n/U /F force dismounting the FS even if there are opened files on it \n/F - force mounting with dismounting existing FS \n/S - mount drive as synchronous\n/R - remount the file system ");
+
+TBool CShell::iDbgPrint = EFalse;
 
 //	lint -e40,e30
 const TShellCommand CShell::iCommand[ENoShellCommands]=
@@ -71,7 +75,7 @@
     TShellCommand(_L("DRVINFO"),_L("Print information about present drive(s) in the system"),_L("[DriveLetter:[\\]] [/p]\n/p - pause after each drive"),TShellCommand::EPSwitch,ShellFunction::DrvInfo),
 	TShellCommand(_L("SYSINFO"),_L("Print information about system features and status"),_L(""),0,ShellFunction::SysInfo),
     TShellCommand(_L("MOUNT"),_L("Mount / dismount file system on specified drive"),ptrMountHelp,TShellCommand::EUSwitch|TShellCommand::ESSwitch|TShellCommand::EFSwitch|TShellCommand::ERSwitch,ShellFunction::MountFileSystem),
-    TShellCommand(_L("ECHO"),_L("Print out the command line to the console and standard debug port."),_L("[line to print out]"),0,ShellFunction::ConsoleEcho),
+    TShellCommand(_L("ECHO"),_L("Print out the command line to the console and standard debug port."),_L("[line to print out] [/Y/N]\n /Y turn ON copying console output to debug port\n /N turn it OFF "),TShellCommand::EYSwitch|TShellCommand::ENSwitch,ShellFunction::ConsoleEcho),
 	TShellCommand(_L("RUNEXEC"),_L("Run a program in a loop"),_L("count filename[.exe] [/E/S/R]\n	/E - exit early on error\n	/S - count in seconds\n	     zero - run forever\n	/R - reset debug regs after each run"),TShellCommand::EESwitch|TShellCommand::ESSwitch|TShellCommand::ERSwitch,ShellFunction::RunExec),
 
     };
@@ -363,6 +367,7 @@
 	    if (nRes<0)
 		    return(nRes);
 
+	    //-- this is, actually, FAT FS specific error codes. Other file systems can report different values.
 	    switch(nRes)
 		    {
 	    case 0:
@@ -1053,8 +1058,8 @@
 */
 void FormatVolInfo(const TVolumeInfo& volInfo , TDes& aPrintBuf)
     {
-   	aPrintBuf.Format(_L("VolSz:%ld Free:%ld\n"),volInfo.iSize, volInfo.iFree);
-   	aPrintBuf.AppendFormat(_L("VolId:0x%x VolName:%S\n"),volInfo.iUniqueID, &volInfo.iName);
+   	aPrintBuf.Format(_L("VolSz:%ld Free:%ld"),volInfo.iSize, volInfo.iFree);
+   	aPrintBuf.AppendFormat(_L("\r\nVolId:0x%x VolName:%S\n"),volInfo.iUniqueID, &volInfo.iName);
     }
 
 //--------------------------------------------------------
@@ -1083,7 +1088,7 @@
 
     @return standard error code
 */
-TInt PrintDrvInfo(RFs& aFs, TInt aDrvNum, CConsoleBase* apConsole, TUint aFlags = EAll)
+TInt PrintDrvInfo(RFs& aFs, TInt aDrvNum, TUint aFlags = EAll)
     {
 	TInt        nRes;
 	TDriveInfo 	driveInfo;
@@ -1094,7 +1099,7 @@
 	nRes = aFs.Drive(driveInfo, aDrvNum);
 	if(nRes != KErrNone)
 		{
-		CShell::TheConsole->Printf(_L("Error: %d\n"), nRes);
+        CShell::Printf(_L("Error: %d\n"), nRes);
 		return nRes;   //-- can't get information about the drive
 		}
 
@@ -1103,10 +1108,10 @@
     const TBool bVolumeOK  = (nRes == KErrNone);
 	if(!bVolumeOK)
 	{//-- can't get information about the volume. It might be just corrupt/unformatted
-		CShell::TheConsole->Printf(_L("Error getting volume info. code: %d\n"), nRes);
+        CShell::Printf(_L("Error getting volume info. code: %d\n"), nRes);
         if(nRes == KErrCorrupt)
         {
-            CShell::TheConsole->Printf(_L("The volume might be corrupted or not formatted.\n"));
+            CShell::Printf(_L("The volume might be corrupted or not formatted.\n"));
         }
 	}
 
@@ -1115,14 +1120,14 @@
 	if(aFlags & EFSInfo)
     {
         //-- print out drive properties
-        Buf.Format(_L("\nDrive %c: No:%d"), 'A'+aDrvNum, aDrvNum);
+        Buf.Format(_L("Drive %c: No:%d"), 'A'+aDrvNum, aDrvNum);
         
         //-- find out if the drive is synchronous / asynchronous
         TPckgBuf<TBool> drvSyncBuf;
         nRes = aFs.QueryVolumeInfoExt(aDrvNum, EIsDriveSync, drvSyncBuf);
         if(nRes == KErrNone)
         {
-            Buf.AppendFormat(_L(", Sync:%d"), drvSyncBuf() ? 1:0);        
+            Buf.AppendFormat(_L(" Sync:%d"), drvSyncBuf() ? 1:0);        
         }
 
         //-- find out if drive runs a rugged FS (debug mode only)
@@ -1132,12 +1137,12 @@
         nRes=aFs.ControlIo(aDrvNum, KControlIoIsRugged, pRugged);
         if(nRes == KErrNone)
         {
-            Buf.AppendFormat(_L(", Rugged:%d"), ruggedFS ? 1:0);        
+            Buf.AppendFormat(_L(" Rugged:%d"), ruggedFS ? 1:0);        
         }
 
-        Buf.Append(_L("\n"));
-        apConsole->Printf(Buf);
-
+        CShell::Printf(KNl);
+        Buf.Append(KNl);
+        CShell::Printf(Buf);
 
 	    //-- print the FS name
 	    if(aFs.FileSystemName(Buf, aDrvNum) == KErrNone)
@@ -1157,8 +1162,7 @@
                  Buf.AppendFormat(_L(" PExt:%S"), &fsName);
             }
 
-
-            apConsole->Printf(_L("Mounted FS:%S\n"), &Buf);
+            CShell::Printf(_L("Mounted FS:%S\n"), &Buf);
 
             //-- print out the list of supported file systems if there are more than 1
             nRes = aFs.SupportedFileSystemName(fsName, aDrvNum, 0+1); //-- try to get 2nd child name
@@ -1174,8 +1178,8 @@
                     Buf.AppendFormat(_L("%S, "), &fsName);
                 }
             
-                Buf.Append(_L("\n"));
-                apConsole->Printf(Buf);
+                Buf.Append(KNl);
+                CShell::Printf(Buf);
             }
 
 
@@ -1203,23 +1207,23 @@
                 {
                     if(volIoInfo.iBlockSize >= 0)
                     {
-                        Buf.AppendFormat(_L(", BlkSz:%d"), volIoInfo.iBlockSize);
+                        Buf.AppendFormat(_L("BlkSz:%d "), volIoInfo.iBlockSize);
                     }
                     
                     if(volIoInfo.iClusterSize >= 0)
                     {
-                        Buf.AppendFormat(_L(", ClSz:%d"), volIoInfo.iClusterSize);
+                        Buf.AppendFormat(_L("ClSz:%d "), volIoInfo.iClusterSize);
                     }
 
-                    Buf.AppendFormat(_L(", CacheFlags:0x%x"), volInfo.iFileCacheFlags);
+                    Buf.AppendFormat(_L("CacheFlags:0x%x "), volInfo.iFileCacheFlags);
                 
                 }
 
 
                 if(Buf.Length())
                 {
-                    Buf.Append(_L("\n"));
-                    apConsole->Printf(Buf);    
+                    Buf.Append(KNl);
+                    CShell::Printf(Buf);
                 }
 
             }
@@ -1230,22 +1234,21 @@
 	if(aFlags & EMediaTypeInfo)
     {
         FormatDrvMediaTypeInfo(driveInfo, Buf);
-	    apConsole->Printf(Buf);
-
+        CShell::Printf(Buf);
 	}
     
     //-- print drive attributes
 	if(aFlags & EDrvAttInfo)
     {
         FormatDriveAttInfo(driveInfo, Buf);
-	    apConsole->Printf(Buf);
+        CShell::Printf(Buf);
     }
 
     //-- print media attributes
 	if(aFlags & EMediaAttInfo)
     {
 	    FormatMediaAttInfo(driveInfo, Buf);
-	    apConsole->Printf(Buf);
+        CShell::Printf(Buf);
     }
 
 
@@ -1253,7 +1256,7 @@
 	if(bVolumeOK && (aFlags & EVolInfo))
     {
 	    FormatVolInfo(volInfo, Buf);
-	    apConsole->Printf(Buf);
+        CShell::Printf(Buf);
     }
 	
     return KErrNone;
@@ -1324,7 +1327,7 @@
 		nDrv = DoExtractDriveLetter(aArgs);
         if(nDrv < 0)
             {
-            CShell::TheConsole->Printf(_L("Invalid drive specifier!\n"));    
+            CShell::Printf(_L("Invalid drive specification\n"));    
             return KErrNone;
             }
 		}
@@ -1336,7 +1339,7 @@
 	nRes=TheShell->TheFs.DriveList(driveList);
 	if(nRes != KErrNone)
 		{
-		CShell::TheConsole->Printf(_L("\nError: %d"), nRes);
+        CShell::Printf(_L("\nError: %d"), nRes);
 		return nRes;
 		}
 
@@ -1344,11 +1347,11 @@
 		{//-- the drive is specified
 		if(!driveList[nDrv])
 			{
-			CShell::TheConsole->Printf(_L("Invalid drive specification\n"));
+            CShell::Printf(_L("Invalid drive specification\n"));
 			return KErrNone;
 			}
 
-		PrintDrvInfo(TheShell->TheFs, nDrv, CShell::TheConsole);
+		PrintDrvInfo(TheShell->TheFs, nDrv);
 		}
 	else
 		{//-- print information about all drives in the system
@@ -1357,11 +1360,11 @@
 			if(!driveList[nDrv])
 				continue;   //-- skip unexisting drive
 
-			PrintDrvInfo(TheShell->TheFs, nDrv, CShell::TheConsole);
+			PrintDrvInfo(TheShell->TheFs, nDrv);
 
 			if(aSwitches & TShellCommand::EPSwitch)
 				{//-- /p switch, pause after each drive
-				CShell::TheConsole->Printf(_L("\n--- press any key to continue or Esc to exit ---\n"));
+                CShell::Printf(_L("\n--- press any key to continue or Esc to exit ---\n"));
 
 				TKeyCode key = CShell::TheConsole->Getch();
 				if (key==EKeyEscape)
@@ -1369,7 +1372,9 @@
 				}
 			else
 				{
-				CShell::TheConsole->Printf(_L("\n----------\n"));
+				CShell::Printf(_L("\n----------\n"));
+                CShell::Printf(_L("\n--- press any key to continue or Esc to exit ---\n"));
+
 				}
 		}
 	}
@@ -1418,7 +1423,7 @@
 
 
 //-----------------------------------------------------------------------------------------------------------------------
-TInt DoDismountFS(RFs& aFs, TInt aDrvNum)
+TInt DoDismountFS(RFs& aFs, TInt aDrvNum, TBool aForceDismount)
 {
     TInt        nRes;
     TBuf<40>    fsName;
@@ -1428,6 +1433,8 @@
     if(nRes != KErrNone)
         return KErrNotFound;//-- nothing to dismount
         
+    if(!aForceDismount)    
+    {//-- gaceful attempt to dismount the FS
     nRes = aFs.DismountFileSystem(fsName, aDrvNum);
     if(nRes != KErrNone)
     {
@@ -1440,6 +1447,17 @@
     return KErrNone;
     }
 }
+    else
+    {//-- dismount by force
+        TRequestStatus rqStat;
+        aFs.NotifyDismount(aDrvNum, rqStat, EFsDismountForceDismount);  
+        User::WaitForRequest(rqStat);
+        
+        CShell::TheConsole->Printf(_L("'%S' filesystem Forcedly dismounted from drive %c:\n"), &fsName, 'A'+aDrvNum);
+
+        return rqStat.Int(); 
+    }
+}
 
 //-----------------------------------------------------------------------------------------------------------------------
 TInt DoRemountFS(RFs& aFs, TInt aDrvNum)
@@ -1483,7 +1501,7 @@
     }
 
     //-- 4. dismount the file system
-    nRes = DoDismountFS(aFs, aDrvNum);
+    nRes = DoDismountFS(aFs, aDrvNum, EFalse);
     if(nRes != KErrNone)
         return nRes;
 
@@ -1515,16 +1533,27 @@
 /**
     Mount or dismount the file system on the specified drive.
 
-    MOUNT <DriveLetter:[\]> <FSY:xxx> <FS:yyy> [PEXT:zzz] [/S] [/U]
+    MOUNT <DriveLetter:[\]> <FSY:xxx> <FS:yyy> [PEXT:zzz] [/S] [/U] [/F]
   
     xxx is the *.fsy file system plugin name, like "elocal.fsy" or "elocal"
     yyy is the file system name that the fsy module exports, like "FAT"
     zzz is the optional parameter that specifies primary extension name
 
     /u dismounts a filesystem on the specified drive; e.g. "mount d: /u"
-    /s for mounting FS specifies that the drive will be mounted as synchronous one.
-    /f for forcing mounting the FS; the previous one will be automatically dismounted
-    /r remount existing FS (dismount and mount it back)
+        additional switch /f in conjunction with /u will perform "forced unmounting" i.e. unmounting the FS 
+        even it has opened files and / or directories. E.g. "mount d: /u /f"
+
+    
+    /s for mounting FS specifies that the drive will be mounted as a synchronous one.
+        
+
+    /f for forcing mounting the FS; the previous one will be automatically dismounted. 
+        example: "mount d: /f fsy:exfat fs:exfat" this command will dismount whatever FS ic currently mounted and 
+        mount exFAT FS instead
+
+
+    
+    /r remount existing FS (dismount and mount it back); example: "mount d: /r"
 */
 TInt ShellFunction::MountFileSystem(TDes& aArgs, TUint aSwitches)
 {
@@ -1559,10 +1588,10 @@
         return nRes;
     }
     
-    //-- check if we dismounting the FS (/U switch)
+    //-- check if we dismounting the FS (/U switch).
     if(aSwitches & TShellCommand::EUSwitch)
-    {
-        nRes = DoDismountFS(fs, drvNum);
+    {//-- also take nto account "/f" switch for forced dismounting
+        nRes = DoDismountFS(fs, drvNum, (aSwitches & TShellCommand::EFSwitch));
         
         if(nRes == KErrNotFound)
         {//-- nothing to dismount
@@ -1576,7 +1605,7 @@
     //-- check if we need to forcedly dismount the existing FS (/F switch)
     if(aSwitches & TShellCommand::EFSwitch)
     {
-        nRes = DoDismountFS(fs, drvNum);
+        nRes = DoDismountFS(fs, drvNum, EFalse);
         
         if(nRes != KErrNotFound && nRes !=KErrNone)
             return nRes;
@@ -1662,7 +1691,7 @@
     }
 
 
-    PrintDrvInfo(fs, drvNum, CShell::TheConsole, EFSInfo | EVolInfo);
+    PrintDrvInfo(fs, drvNum, EFSInfo | EVolInfo);
 
     return KErrNone;
 }
@@ -3604,7 +3633,34 @@
 	return err;
 	}
 
-_LIT(KCrNl, "\r\n");
+
+
+//----------------------------------------------------------------------
+void CShell::Printf(TRefByValue<const TDesC16> aFmt, ...)
+{
+	TBuf<256> buf;
+	VA_LIST list;					
+	VA_START(list, aFmt);
+	// coverity[uninit_use_in_call]
+	buf.FormatList(aFmt, list);			
+
+    if(!buf.Length())
+        return;
+
+    TheConsole->Printf(buf);
+
+    if(iDbgPrint)
+    {
+        const TInt bufLen = buf.Length();
+        if(buf[bufLen-1] == '\n')
+        {
+            buf.Insert(bufLen-1, _L("\r"));
+        }
+    
+        RDebug::RawPrint(buf);
+    }
+
+}
 
 void SIPrintf(TRefByValue<const TDesC16> aFmt, ...)
 	{
@@ -3779,9 +3835,29 @@
 //-------------------------------------------------------------------------
 /**
     Print out the command line to the console and standard debug port.
+
+    echo [some text] [/y] [/n]
+
+		/Y : switches ON copying console output to the debug port
+		/N : switches OFF copying console output to the debug port
+
 */
-TInt ShellFunction::ConsoleEcho(TDes& aArgs, TUint /*aSwitches*/)
+TInt ShellFunction::ConsoleEcho(TDes& aArgs, TUint aSwitches)
 {
+    if(aSwitches & TShellCommand::EYSwitch)
+    {
+        CShell::SetDbgConsoleEcho(ETrue);
+    }
+    else
+    if(aSwitches & TShellCommand::ENSwitch)
+    {
+        CShell::SetDbgConsoleEcho(EFalse);
+    }
+
+    if(aArgs.Length())
     SIPrintf(aArgs);
+    
     return KErrNone;
 }
+
+
--- a/userlibandfileserver/fileserver/etshell/ts_std.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/etshell/ts_std.h	Tue Jul 06 15:50:07 2010 +0300
@@ -146,6 +146,10 @@
 	static TKeyCode OutputStringToConsole(TBool aPageSwitch,TRefByValue<const TDesC> aFmt,...);
 	static TKeyCode OutputStringToConsole(TBool aPageSwitch, const TDesC& aBuf);
 	static TKeyCode OutputStringToConsole(const TDesC& aNotification,TBool aPageSwitch,TRefByValue<const TDesC> aFmt,...);
+
+    static void Printf(TRefByValue<const TDesC16> aFmt, ...);
+    static void SetDbgConsoleEcho(TBool aOn) {iDbgPrint = aOn;}
+
 public:
 	static CConsoleBase* TheConsole;
 	static CFileMan* TheFileMan;
@@ -166,6 +170,7 @@
 	static TInt RunBatch(TDes& aCommand);
 	static TInt RunExecutable(TDes& aCommand,TBool aWaitForCompletion);
 	static TKeyCode PageSwitchDisplay(const TDesC& aBuf);
+
 private:
 	static TBuf<KMaxFileName> currentPath;
 	static TBuf<KMaxFileName> drivePaths[KMaxDrives];
@@ -174,6 +179,9 @@
 	static CLineEdit* TheEditor;
 	friend class ShellFunction;
 	friend class CDllChecker;
+	
+    static TBool iDbgPrint; ///< if ETrue, the output from CShell::Printf is copied to the debug port
+    
 	};
 
 
--- a/userlibandfileserver/fileserver/group/release.txt	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/group/release.txt	Tue Jul 06 15:50:07 2010 +0300
@@ -1,3 +1,34 @@
+Version 2.00.3049
+=================
+(Made by vfebvre 15/06/2010)
+
+1.	migubarr
+	1.	ou1cimx1#393016 Crash when usb memory is dismounted during copy
+
+2.	michcox
+	1.	ou1cimx1#419149 MCL fix CDirStack array panic
+
+
+Version 2.00.3048
+=================
+(Made by vfebvre 14/06/2010)
+
+1.	migubarr
+	1.	ou1cimx1#420772 File Server flushes FAT metadata too often
+
+
+Version 2.00.3047
+=================
+(Made by vfebvre 11/06/2010)
+
+1.	dlyokhin
+	1.	ou1cimx1#423683 IT__BITO_SSS - 92_201019_hw79- \sf\os\kernelhwsrv\- Bad usage of RXXX::Connect() derived from RSessionBase
+
+2.	paconway
+	1.	DEF144802 CDynamicDirCache tests should be automated
+	2.	DEF144801 CDynamicDirCache leaks cache pages occasionally
+
+
 Version 2.00.3046
 =================
 (Made by vfebvre 07/06/2010)
--- a/userlibandfileserver/fileserver/inc/f32dbg.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/inc/f32dbg.h	Tue Jul 06 15:50:07 2010 +0300
@@ -188,6 +188,12 @@
 const TInt KControlIoObjectCount=KMaxTInt-22;
 
 const TInt KControlIoIsFileSequential=KMaxTInt-23;
+const TInt KControlIoGlobalCacheConfig=KMaxTInt-24;
+const TInt KControlIoGlobalCacheInfo=KMaxTInt-25;
+const TInt KControlIoDirCacheConfig=KMaxTInt-26;
+const TInt KControlIoDirCacheInfo=KMaxTInt-27;
+const TInt KControlIoSimulateMemoryLow=KMaxTInt-28;
+const TInt KControlIoStopSimulateMemoryLow=KMaxTInt-29;
 
 const TInt KNCDebugNotifierValue=-500000;	// between 0 and 1 second
 
@@ -256,6 +262,88 @@
 
 extern TBool EnableFatUtilityFunctions;
 
+class TGlobalCacheConfig
+    {
+public:
+    TInt32 iGlobalCacheSizeInBytes;      		// in bytes 
+    TInt32 iGlobalLowMemoryThreshold;         	// in percentage
+    };
+
+class TGlobalCacheInfo
+    {
+public:
+    TInt32 iGlobalCacheSizeInBytes;     		// in bytes 
+    TInt32 iGlobalLowMemoryThreshold;   		// in percentage
+    };
+
+class TDirCacheConfig
+    {
+public:
+    TInt iDrive;
+
+    TInt32 iLeafDirCacheSize;           // in number of most recently visited leaf directories
+    TInt32 iDirCacheSizeMin;            // in bytes
+    TInt32 iDirCacheSizeMax;            // in bytes
+    };
+
+class TDirCacheInfo
+    {
+public:
+    TInt iDrive;
+
+    /**
+    Segment size in bytes. A memory segment is the smallest memory unit that Kernel manages through RChunk.
+    */
+    TInt32 iMemorySegmentSize;
+
+    /**
+    Size of memory a page occupies, in bytes.
+    Note: following restrictions may result a difference between page size in memory & page size in data:
+        1. page size can not be smaller than segment size
+        2. one page can not contain data from two different clusters
+    */
+    TInt32 iPageSizeInMemory;
+
+    /**
+    Size of actual data a page contains, in bytes.
+    Note: following restrictions may result a difference between page size in memory & page size in data:
+        1. page size can not be smaller than segment size
+        2. one page can not contain data from two different clusters
+    */
+    TInt32 iPageSizeInData;
+    
+    /**
+    The minimum number of pages that the cache can contain, even under low memory conditions.
+    */
+    TInt32 iMinCacheSizeInPages;
+
+    /**
+    The maximum number of pages that the cache can contain, when there is enough free memory in the system.
+    */
+    TInt32 iMaxCacheSizeInPages;
+    
+    /**
+    The minimum cache size in memory. In bytes.
+    */
+    TInt32 iMinCacheSizeInMemory;
+
+    /**
+    The maximum cache size in memroy. In bytes.
+    */
+    TInt32 iMaxCacheSizeInMemory;
+    
+    /**
+    Current count of the locked pages.
+    */
+    TInt32 iLockedPageNumber;
+
+    /**
+    Current count of the unlocked pages.
+    */
+    TInt32 iUnlockedPageNumber;
+    
+    };
+
 #endif
 
 enum TLoaderDebugFunction
--- a/userlibandfileserver/fileserver/inc/f32fsys.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/inc/f32fsys.h	Tue Jul 06 15:50:07 2010 +0300
@@ -508,7 +508,7 @@
 	void DoEntryL(const TDesC& aName,TEntry& anEntry);
 	void ReadSectionL(const TDesC& aName,TInt64 aPos,TAny* aTrg,TInt aLength,const RMessagePtr2& aMessage);
 	TInt ValidateShare(CFileCB& aFile,TShare aReqShare);
-	TInt CheckAttributes(const TDesC& aName,TUint& aSetAttMask,TUint& aClearAttMask);
+	TInt CheckAttributes(TUint& aSetAttMask,TUint& aClearAttMask);
 	TBool IsExtensionMounted(CProxyDriveFactory* aFactory);
 	CFileCB* LocateFile(const TDesC& aName);
 	CFileCache* LocateClosedFile(const TDesC& aName, TBool aResurrect = ETrue);
@@ -2492,6 +2492,7 @@
 
 
 
+class CProxyDriveBody;	// fwd ref
 /**
 @publishedPartner
 @released
@@ -2517,6 +2518,10 @@
 	IMPORT_C virtual TInt GetLastErrorInfo(TDes8& aErrorInfo);
 
 	inline TInt LocalBufferSupport();
+
+	TInt SetAndOpenLibrary(RLibrary aLibrary);
+	RLibrary GetLibrary();
+
 	
 // pure virtual
 
@@ -2760,7 +2765,9 @@
 		
 private:
 	CMountCB* iMount;
-	TUint32 iReserved;				// Reserved for future expansion
+	CProxyDriveBody* iBody;
+
+friend class LocalDrives;
 	};
 
 
--- a/userlibandfileserver/fileserver/inc/f32ver.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/inc/f32ver.h	Tue Jul 06 15:50:07 2010 +0300
@@ -58,6 +58,6 @@
 
 @see TVersion
 */
-const TInt KF32BuildVersionNumber=3046;
+const TInt KF32BuildVersionNumber=3049;
 //
 #endif
--- a/userlibandfileserver/fileserver/sfat32/inc/sl_std.inl	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/inc/sl_std.inl	Tue Jul 06 15:50:07 2010 +0300
@@ -523,9 +523,9 @@
     }  
 
 void CFatFileCB::IndicateFileSizeModified(TBool aModified) 
-    {
-    iFileSizeModified = aModified;
-    }
+	{
+	iFileSizeModified = aModified;
+	}
 
 //-----------------------------------------------------------------------------
 /** @return ETrue if file attributes' 'Modified' flag is set*/
--- a/userlibandfileserver/fileserver/sfat32/sl_dir_cache.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_dir_cache.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -113,6 +113,7 @@
                   iMinSizeInPages(aMinPageNum),
                   iMaxSizeInPages(aMaxPageNum),
                   iDrive(aDrive),
+				  iLastVisitedPage(NULL),
                   iLockedQ(_FOFF(TDynamicDirCachePage, iLink)),
                   iUnlockedQ(_FOFF(TDynamicDirCachePage, iLink)),
                   iLockedQCount(0),
@@ -158,19 +159,19 @@
 
 	// allocate as many permanently locked pages as there are threads - plus one
 	// otherwise DoMakePageMRU() won't work properly with only one thread
-	//-- At present moment the size of TDrive thread pool is 1 (1 drive thread in a pool)
-	const TUint KThreadCount = 1;
-	iPermanentlyAllocatedPageCount = KThreadCount + 1; 
+    //-- At present moment the size of TDrive thread pool is 1 (1 drive thread in a pool)
+    const TUint KThreadCount = 1;
+    iPermanentlyAllocatedPageCount = KThreadCount; 
 
 	if (iPermanentlyAllocatedPageCount > iMinSizeInPages)
 		iMinSizeInPages = iPermanentlyAllocatedPageCount;
 
 	for (TUint n=0; n<iPermanentlyAllocatedPageCount; n++)
 		{
-		TDynamicDirCachePage* pPage = AllocateAndLockNewPage(0);
-		ASSERT(pPage);
-		if (!pPage)
-			User::Leave(KErrNoMemory);
+        TDynamicDirCachePage* pPage = AllocateAndLockNewPage();
+        ASSERT(pPage);
+        if (!pPage)
+            User::Leave(KErrNoMemory);
 		AddFirstOntoQueue(pPage, TDynamicDirCachePage::ELocked);
 		LookupTblAdd(pPage);
 		}
@@ -191,42 +192,6 @@
     }
 
 /**
-Insert an unlocked page into the last position of the locked queue, may squeeze the original last page into
-the unlocked queue.
-This function is used on last visited but 'unlocked' pages to avoid excessive lock/unlock calls to cache memory
-manager as contiguous entry reading/writing often happens on the same page.
-@param	aPage	the page to be inserted.
-@pre	the page type of aPage should only be TDynamicDirCachePage::EUnknown
-*/
-void CDynamicDirCache::MakePageLastLocked(TDynamicDirCachePage* aPage)
-	{
-	// this function should not be called on active pages
-	ASSERT(aPage->iType == TDynamicDirCachePage::EUnknown);
-
-	if (iLockedQ.IsEmpty())
-		{
-		// if locked queue is empty, add it onto the locked queue directly
-		AddFirstOntoQueue(aPage, TDynamicDirCachePage::ELocked);
-		}
-	else
-		{
-		// otherwise, we squeeze for the last position on locked queue
-		while (iLockedQCount + 1 >= iMinSizeInPages)
-			{
-			TDynamicDirCachePage* last = iLockedQ.Last();
-			DeQueue(last);
-			UnlockPage(last);
-			AddFirstOntoQueue(last, TDynamicDirCachePage::EUnlocked);
-			}
-
-		// iLockedQCount + 1 < iMinSizeInPages
-		iLockedQ.AddLast(*aPage);
-		aPage->SetPageType(TDynamicDirCachePage::ELocked);
-		iLockedQCount++;
-		}
-	}
-
-/**
     Read data from a single page. If the page is not found or not valid anymore, read media onto iActive page first.
     The data will be _Appended_ the the descriptor aDes. The caller is responsible for maintaining this descriptor.
 
@@ -248,13 +213,19 @@
             aDes.Append(pPage->PtrInPage(aPos), aLength);
 
 
-            // if page is from unlocked queue, insert it onto the last page of the locked
-            //  queue. this is to avoid excessive locking and unlocking operations that is
-            //  highly likely to happen for following reads.
-            if (pPage->PageType() == TDynamicDirCachePage::EUnlocked)
-            	{
-            	DeQueue(pPage);
-            	MakePageLastLocked(pPage);
+            // if page is from unlocked queue, try to keep it locked until we move to a 
+            //  different page from the unlocked queue 
+            // this is to avoid excessive locking and unlocking operations that is
+            //  highly likely to happen when DoFindL() linearly scan through the directory
+            if (pPage->PageType() == TDynamicDirCachePage::EUnlocked
+                && iLastVisitedPage != pPage)
+                {
+                // Note: iLastVisitedPage may have been moved from unlocked queue to locked queue
+                if(iLastVisitedPage && iLastVisitedPage->PageType() == TDynamicDirCachePage::EUnlocked)
+                    {
+                    User::LeaveIfError(UnlockPage(iLastVisitedPage));
+                    }
+                iLastVisitedPage = pPage;
             	}
     		}
     	else	// page locking failed
@@ -624,23 +595,32 @@
         case EDumpCache:
         	{
         	RFs fs;
-        	fs.Connect();
+        	r = fs.Connect();
+            if(r != KErrNone)
+                break;
+
         	const TUint32 debugRegister = DebugRegister();
         	fs.SetDebugRegister(debugRegister|KFSYS);
         	Dump();
         	fs.SetDebugRegister(debugRegister);
         	fs.Close();
+        	r = KErrNone;
         	break;
         	}
         case ECacheInfo:
         	{
         	RFs fs;
-        	fs.Connect();
+        	r = fs.Connect();
+            if(r != KErrNone)
+                break;
+        	
         	const TUint32 debugRegister = DebugRegister();
         	fs.SetDebugRegister(debugRegister|KFSYS);
-        	Info();
+            TDirCacheInfo* aInfo = static_cast<TDirCacheInfo*>(aParam2);
+            Info(aInfo);
         	fs.SetDebugRegister(debugRegister);
         	fs.Close();
+        	r = KErrNone;
         	break;
         	}
 
@@ -683,14 +663,14 @@
 	{
 //	__PRINT1(_L("MakePageMRU (%lx)"), aPos);
 //	__PRINT4(_L("Current Cache State: iLockedQCount=%d, iUnlockedQCount=%d, iLookupTbl=%d, iMaxSizeInPages=%d"), iLockedQCount, iUnlockedQCount, iLookupTable.Count(), iMaxSizeInPages);
-	// check there are at least two locked pages
-	ASSERT(iLockedQCount > 1);
+	// check there are at least one locked pages
+	ASSERT(iLockedQCount > 0);
 	
 	// check the MRU page first, if it is already the MRU page, we can return immediately
 	TInt64 pageStartMedPos = CalcPageStartPos(aPos);
 	if (!iLockedQ.IsEmpty())
 		{
-		if (iLockedQ.First()->StartPos() == pageStartMedPos)
+        if (iLockedQCount > 1 && iLockedQ.First()->StartPos() == pageStartMedPos)
 			{
 			return;
 			}
@@ -703,7 +683,7 @@
 		// lock page before make it MRU
 		if (pPage->PageType() == TDynamicDirCachePage::EUnlocked)
 			{
-			ASSERT(!pPage->IsLocked());
+            ASSERT(!pPage->IsLocked() || (pPage->IsLocked() && pPage == iLastVisitedPage));
 			if (LockPage(pPage) == NULL)
 				{
 				DeQueue(pPage);
@@ -735,8 +715,9 @@
 	ASSERT(pPage && pPage->IsValid() && pPage->IsLocked());
 
 
-	// if we used the active page (last on the queue), try to grow the cache.
-	TBool growCache = pPage == iLockedQ.Last();
+
+    TBool makeNewPageMRU = pPage == iLockedQ.Last();
+
 
 	switch (pPage->PageType())
 		{
@@ -764,16 +745,27 @@
 			ASSERT(0);
 		}
 
-	if (CacheIsFull() || !growCache)
-		return;
+    if (!makeNewPageMRU)
+        return;
+    
+    // when cache is full and a new MRU page is about to be added, we will need to evict the LRU page
+    //  accordingly
+    if (CacheIsFull())
+        {
+        TUint32& queueCnt = iMaxSizeInPages - iMinSizeInPages > 0 ? iUnlockedQCount : iLockedQCount;
+        queueCnt++;
+        CheckThresholds();
+        queueCnt--;
+        }
 
-	// attempt to grow the cache by appending a clean, new page at the end of the LRU list.
-	// This can fail when out of memory; the LRU mechanism then makes sure the oldest page will be re-used.
-	TDynamicDirCachePage* nPage = AllocateAndLockNewPage(0);
-	if (!nPage)
-		return;
+    // attempt to grow the cache by appending a clean, new page at the end of the locked page queue.
+    // This can fail when out of memory; the LRU mechanism then makes sure the oldest page will be re-used.
+    TDynamicDirCachePage* nPage = AllocateAndLockNewPage();
+    if (!nPage)
+        return;
 
-	// about to add a page to end of locked queue, so lie about iLockedQCount
+    // about to add the new active page, force the locked queue to evict the existing last page to make room 
+    //  for the new active page 
 	iLockedQCount++;
 	CheckThresholds();
 	iLockedQCount--;
@@ -781,7 +773,6 @@
 	iLockedQ.AddLast(*nPage);
 	nPage->SetPageType(TDynamicDirCachePage::ELocked);
 	++iLockedQCount;
-	LookupTblAdd(nPage);
 	}
 
 /**
@@ -857,7 +848,7 @@
 */
 void CDynamicDirCache::CheckThresholds()
 	{
-	while (iLockedQCount + 1 > iMinSizeInPages)
+    while (iLockedQCount > iMinSizeInPages)
 		{
 		TDynamicDirCachePage* movePage = iLockedQ.Last();
 		UnlockPage(movePage);
@@ -897,65 +888,67 @@
 Try to create a new page and lock the page content when it is created. This function should only be called
 when creating iActive page or making a page MRU (which might result in page evictions).
 @return	the pointer of the newly created page, or NULL if allocation failed.
-@param	aStartMedPos	the starting media address of the page to be created.
-@pre	aStartMedPos should not already be existing in the cache.
 */
-TDynamicDirCachePage* CDynamicDirCache::AllocateAndLockNewPage(TInt64 aStartMedPos)
-	{
-	__PRINT1(_L("CDynamicDirCache::AllocateAndLockNewPage(aStartMedPos=%lx)"), aStartMedPos);
+TDynamicDirCachePage* CDynamicDirCache::AllocateAndLockNewPage(/*TInt64 aStartMedPos*/)
+    {
+    __PRINT(_L("CDynamicDirCache::AllocateAndLockNewPage()"));
 
-	TUint8* startRamAddr = iCacheMemoryClient->AllocateAndLockSegments(PageSizeInSegs());
+    TUint8* startRamAddr = iCacheMemoryClient->AllocateAndLockSegments(PageSizeInSegs());
+
+    if (!startRamAddr)
+        return NULL;
 
-	if (!startRamAddr)
-		return NULL;
-
-	TDynamicDirCachePage* pPage = TDynamicDirCachePage::CreateCachePage(this, aStartMedPos, startRamAddr);
+    TDynamicDirCachePage* pPage = TDynamicDirCachePage::CreateCachePage(this, 0, startRamAddr);
 
-	// Failure would mean the cache chunk was able to grow but we've run out of heap.
-	// This seems extremely unlikely, but decommit the now-unmanageable cache segment just in case.
-	if (!pPage)
-		{
-		iCacheMemoryClient->DecommitSegments(startRamAddr, PageSizeInSegs());
-		return NULL;
-		}
+    // Failure would mean the cache chunk was able to grow but we've run out of heap.
+    // This seems extremely unlikely, but decommit the now-unmanageable cache segment just in case.
+    if (!pPage)
+        {
+        iCacheMemoryClient->DecommitSegments(startRamAddr, PageSizeInSegs());
+        return NULL;
+        }
 
 	pPage->SetLocked(ETrue);
 	pPage->SetValid(EFalse);
 	return pPage;
 	}
 
-#ifdef _DEBUG
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
 /**
 Dump cache information, only enabled in debug mode.
 @see CDynamicDirCache::Control()
 */
-void CDynamicDirCache::Info() const
-	{
-	__PRINT(_L("======== CDynamicDirCache::Info ========="));
-	const TUint32 SegmentSizeInBytesLog2 = CCacheMemoryManagerFactory::CacheMemoryManager()->SegmentSizeInBytesLog2();
-	// page size
-	__PRINT1(_L("=== Pages size:               [%d Bytes]"), iPageSizeInBytes);
-	__PRINT1(_L("=== Segment size:             [%d Bytes]"), 1 << SegmentSizeInBytesLog2);
+void CDynamicDirCache::Info(TDirCacheInfo* aInfo) const
+    {
+    __PRINT(_L("======== CDynamicDirCache::Info ========="));
+    const TUint32 SegmentSizeInBytesLog2 = CCacheMemoryManagerFactory::CacheMemoryManager()->SegmentSizeInBytesLog2();
+    const TUint32 pageMemSizeLog2 = iPageSizeLog2 > SegmentSizeInBytesLog2 ? iPageSizeLog2 : SegmentSizeInBytesLog2;
+    // page size
+    __PRINT1(_L("=== Segment size:             [%d Bytes]"), 1 << SegmentSizeInBytesLog2);
+    __PRINT1(_L("=== Page data size:           [%d Bytes]"), iPageSizeInBytes);
+    __PRINT1(_L("=== Page mem size:            [%d Bytes]"), 1 << pageMemSizeLog2);
 
-	// data size:
-	__PRINT1(_L("=== Min data size:            [%d Bytes]"), iMinSizeInPages << iPageSizeLog2);
-	__PRINT1(_L("=== Max data size:            [%d Bytes]"), iMaxSizeInPages << iPageSizeLog2);
+    // cache size in pages
+    __PRINT1(_L("=== Min cache size in pages:  [%d]"), iMinSizeInPages);
+    __PRINT1(_L("=== Max cache size in pages:  [%d]"), iMaxSizeInPages);
 
-	// memory size:
-	const TUint32 pageMemSizeLog2 = iPageSizeLog2 > SegmentSizeInBytesLog2 ? iPageSizeLog2 : SegmentSizeInBytesLog2;
-	__PRINT1(_L("=== Min memory size:          [%d Bytes]"), iMinSizeInPages << pageMemSizeLog2);
-	__PRINT1(_L("=== Max memory size:          [%d Bytes]"), iMaxSizeInPages << pageMemSizeLog2);
-
-	// reserved pages
-	__PRINT1(_L("=== Number of pages reserved: [%d]"), iMinSizeInPages);
-	__PRINT1(_L("=== Reserved memory:          [%d Bytes]"), (iMinSizeInPages * PageSizeInSegs()) << SegmentSizeInBytesLog2);
-	// locked page num
-	__PRINT1(_L("=== Number of pages locked:   [%d]"), iLockedQCount);
-	__PRINT1(_L("=== Locked memory:            [%d Bytes]"), (iLockedQCount * PageSizeInSegs()) << SegmentSizeInBytesLog2);
-	// unlocked page num
-	__PRINT1(_L("=== Number of pages unlocked: [%d]"), iUnlockedQCount);
-	__PRINT1(_L("=== Unlocked memory:          [%d Bytes]"), (iUnlockedQCount * PageSizeInSegs()) << SegmentSizeInBytesLog2);
-	}
+    // locked page num
+    __PRINT1(_L("=== Number of pages locked:   [%d]"), iLockedQCount);
+    // unlocked page num
+    __PRINT1(_L("=== Number of pages unlocked: [%d]"), iUnlockedQCount);
+    __PRINT(_L("=========================================\n"));
+    
+    ASSERT(aInfo);
+    aInfo->iMemorySegmentSize       = 1 << SegmentSizeInBytesLog2;
+    aInfo->iPageSizeInMemory        = PageSizeInSegs() << SegmentSizeInBytesLog2;
+    aInfo->iPageSizeInData          = iPageSizeInBytes;
+    aInfo->iMinCacheSizeInPages     = iMinSizeInPages;
+    aInfo->iMaxCacheSizeInPages     = iMaxSizeInPages;
+    aInfo->iMinCacheSizeInMemory    = iMinSizeInPages * aInfo->iPageSizeInMemory;
+    aInfo->iMaxCacheSizeInMemory    = iMaxSizeInPages * aInfo->iPageSizeInMemory;
+    aInfo->iLockedPageNumber        = iLockedQCount;
+    aInfo->iUnlockedPageNumber      = iUnlockedQCount;
+    }
 
 /**
 Dump cache content, only enabled in debug mode.
@@ -1005,7 +998,7 @@
         }
     __PRINT(_L("===========================================\n"));
     }
-#endif //_DEBUG
+#endif //#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
 
 /**
 Lock an unlocked page, or do nothing if the page is already locked.
@@ -1037,14 +1030,17 @@
 	{
 	ASSERT(aPage != NULL);
 	__PRINT1(_L("CDynamicDirCache::UnlockPage(%lx)"), aPage->StartPos());
-	TInt r = iCacheMemoryClient->UnlockSegments(aPage->StartPtr(), PageSizeInSegs());
-	if (r == KErrNone)
-		{
-		aPage->SetLocked(EFalse);
+    if (aPage)
+        {
+		TInt r = iCacheMemoryClient->UnlockSegments(aPage->StartPtr(), PageSizeInSegs());
+		if (r == KErrNone)
+			{
+			aPage->SetLocked(EFalse);
+			}
+		return r;
 		}
-	return r;
-	}
-
+    return KErrArgument;
+    }
 /**
 Decommit a locked or unlocked page.
 @return	TInt	KErrNone if decommition was successful, otherwise system-wide error code.
--- a/userlibandfileserver/fileserver/sfat32/sl_dir_cache.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_dir_cache.h	Tue Jul 06 15:50:07 2010 +0300
@@ -27,6 +27,7 @@
 #include "sf_memory_client.h"
 #include "sl_cache.h"
 #include <e32hashtab.h>
+#include <f32dbg.h>
 
 //---------------------------------------------------------------------------------------------------------------------------------
 class 	CDynamicDirCache;
@@ -132,9 +133,11 @@
 	
 	TUint32 PageSizeInSegs() const;
 
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
     // Debugging functions
 	void Dump();
-	void Info() const;
+	void Info(TDirCacheInfo* aInfo) const;
+#endif //#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
 
 protected:
 	CDynamicDirCache(TDriveInterface& aDrive, TUint32 aMinSizeInBytes, TUint32 aMaxSizeInBytes, TUint32 aPageSizeInBytesLog2, TUint32 aWrGranularityLog2);
@@ -145,7 +148,7 @@
 
 	TDynamicDirCachePage* FindPageByPos(TInt64 aPos);
 	TDynamicDirCachePage* UpdateActivePageL(TInt64 aPos);
-	TDynamicDirCachePage* AllocateAndLockNewPage(TInt64 aStartMedPos);
+	TDynamicDirCachePage* AllocateAndLockNewPage(/*TInt64 aStartMedPos*/);
 	TUint8* LockPage(TDynamicDirCachePage* aPage);
 	TInt 	UnlockPage(TDynamicDirCachePage* aPage);
 	TInt 	DecommitPage(TDynamicDirCachePage* aPage);
@@ -159,7 +162,6 @@
 	TInt LookupTblAdd(TDynamicDirCachePage* aPage);
 	TDynamicDirCachePage* LookupTblFind(TInt64 aPos);
 	TInt ResetPagePos(TDynamicDirCachePage* aPage);
-	void MakePageLastLocked(TDynamicDirCachePage* aPage);
 	void DoMakePageMRU(TInt64 aPos);
 	void DoInvalidateCache(void);
 	
@@ -177,6 +179,9 @@
 	TDriveInterface&    iDrive;        		///< reference to the driver for media access
 	TUint32             iCacheDisabled : 1; ///< if not 0 the cache is disabled totally and all reads and writes go via TDriveInterface directly
 
+	TDynamicDirCachePage* iLastVisitedPage; ///< a pointer to the last visited page, we always keep it locked
+                                            ///<  to avoid excessive lock/unlock activities when we are scanning
+                                            ///<  a page on the UnlockedQueue
 	
 	// data structures for LRU page list	
 	TCachePageList 	iLockedQ;				///< the locked queue that manages all locked pages, limited by minimum page number
--- a/userlibandfileserver/fileserver/sfat32/sl_dir_cache.inl	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_dir_cache.inl	Tue Jul 06 15:50:07 2010 +0300
@@ -194,7 +194,7 @@
 TBool CDynamicDirCache::CacheIsFull() const
 	{
 	// active page, locked page and unlocked page
-	return (iLockedQCount + iUnlockedQCount + 1 >= iMaxSizeInPages);
+	return (iLockedQCount + iUnlockedQCount >= iMaxSizeInPages);
 	}
 
 /**
--- a/userlibandfileserver/fileserver/sfat32/sl_drv.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_drv.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -49,6 +49,7 @@
 {	 
 	 if((iMount != NULL) && (iMount->LocalDrive() != NULL))
 		{
+		ASSERT(iMount->LocalDrive()->Mount() == NULL || iMount->LocalDrive()->Mount() == iMount);
 		iMount->LocalDrive()->SetMount(NULL);
 		}
      iMount = NULL;
--- a/userlibandfileserver/fileserver/sfat32/sl_file.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_file.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -24,13 +24,13 @@
 const TInt KFirstClusterNum=2;
 
 CFatFileCB::CFatFileCB()
-	{
-	__PRINT1(_L("CFatFileCB created 0x%x"),this);
-	}
+    {
+    __PRINT1(_L("CFatFileCB created 0x%x"),this);
+    }
 
 CFatFileCB::~CFatFileCB()
-	{
-	__PRINT1(_L("~CFatFileCB deleted 0x%x"),this);
+    {
+    __PRINT1(_L("~CFatFileCB deleted 0x%x"),this);
 
     //-- a nasty trick to find out if the CFatFileCB is in consistent state on the moment of destruction.
     //-- Because of OOM conditions CFatFileCB might not be fully constructed and to be deleted, while FlushAll()
@@ -42,140 +42,140 @@
             {
             IndicateFileTimeModified(ETrue); //-- this will force writing file modification time to the media on Flush
             TRAP_IGNORE(FlushAllL());
-        }
+            }
         }
 
     delete[] iSeekIndex;
-	}
+    }
 
 
 void CFatFileCB::CreateSeekIndex()
 //
 // Create a seek index
 //
-	{
+    {
 
-	iSeekIndex = new TUint32[KSeekIndexSize];
-	if (iSeekIndex == NULL)
-		return;
+    iSeekIndex = new TUint32[KSeekIndexSize];
+    if (iSeekIndex == NULL)
+        return;
 
-	Mem::FillZ(iSeekIndex, sizeof(TUint32) * KSeekIndexSize);
+    Mem::FillZ(iSeekIndex, sizeof(TUint32) * KSeekIndexSize);
 
-	iSeekIndexSize=CalcSeekIndexSize(FCB_FileSize());
-	}
+    iSeekIndexSize=CalcSeekIndexSize(FCB_FileSize());
+    }
 
 TInt CFatFileCB::SeekToPosition(TUint aNewRelCluster, TUint aClusterOffset)
 //
 // Use the seek index to set iCurrentPos.iCluster as close as possible to aNewRelCluster
 // Return aNewRelCluster-aCurrentPos.iCluster
 //
-	{
-	TInt clusterOffset=aClusterOffset;
-	TInt seekPos=(aNewRelCluster>>iSeekIndexSize)-1;
-	__ASSERT_DEBUG(seekPos<KSeekIndexSize,Fault(EFatFileSeekIndexTooSmall));
+    {
+    TInt clusterOffset=aClusterOffset;
+    TInt seekPos=(aNewRelCluster>>iSeekIndexSize)-1;
+    __ASSERT_DEBUG(seekPos<KSeekIndexSize,Fault(EFatFileSeekIndexTooSmall));
 
-	while(seekPos>=0 && iSeekIndex[seekPos]==0 && clusterOffset!=0)
-		{
-		seekPos--;
-		clusterOffset--;
-		}
-	if (clusterOffset==0) // Counted back to the current cluster
-		return(aClusterOffset);
-	if (seekPos<0)
-		{
-		iCurrentPos.iCluster=FCB_StartCluster();
-		return(aNewRelCluster);
-		}
+    while(seekPos>=0 && iSeekIndex[seekPos]==0 && clusterOffset!=0)
+        {
+        seekPos--;
+        clusterOffset--;
+        }
+    if (clusterOffset==0) // Counted back to the current cluster
+        return(aClusterOffset);
+    if (seekPos<0)
+        {
+        iCurrentPos.iCluster=FCB_StartCluster();
+        return(aNewRelCluster);
+        }
 
-	iCurrentPos.iCluster=iSeekIndex[seekPos];
-	return(aNewRelCluster-((seekPos+1)<<iSeekIndexSize));
-	}
+    iCurrentPos.iCluster=iSeekIndex[seekPos];
+    return(aNewRelCluster-((seekPos+1)<<iSeekIndexSize));
+    }
 
 void CFatFileCB::SetSeekIndexValueL(TUint aRelCluster, TUint aStoredCluster)
 //
 // Sets a value in the seekindex
 //
-	{
+    {
 
-	TInt seekPos=(aRelCluster>>iSeekIndexSize)-1;
-	__ASSERT_DEBUG(seekPos<KSeekIndexSize,Fault(EFatFileSeekIndexTooSmall));
-	__ASSERT_DEBUG(seekPos>=0,Fault(EFatFileSeekIndexTooSmall2));
-	iSeekIndex[seekPos] = aStoredCluster;
-	}
+    TInt seekPos=(aRelCluster>>iSeekIndexSize)-1;
+    __ASSERT_DEBUG(seekPos<KSeekIndexSize,Fault(EFatFileSeekIndexTooSmall));
+    __ASSERT_DEBUG(seekPos>=0,Fault(EFatFileSeekIndexTooSmall2));
+    iSeekIndex[seekPos] = aStoredCluster;
+    }
 
 TBool CFatFileCB::IsSeekBackwards(TUint aPos)
 //
 // Return true if aPos<currentPos
 //
-	{
-	
-	TUint cluster=iCurrentPos.iCluster<<ClusterSizeLog2();
-	TInt offset=ClusterRelativePos(iCurrentPos.iPos);
-	TUint currentPos=cluster+offset;
-	return(aPos<currentPos);
-	}
+    {
+    
+    TUint cluster=iCurrentPos.iCluster<<ClusterSizeLog2();
+    TInt offset=ClusterRelativePos(iCurrentPos.iPos);
+    TUint currentPos=cluster+offset;
+    return(aPos<currentPos);
+    }
 
 void CFatFileCB::CheckPosL(TUint aPos)
 //
 // Check that the file is positioned correctly.
 // If aPos<currentPos attempt to guess the new position.
 //
-	{
-	__PRINT1(_L("CFatFileCB::CheckPosL(%d)"), aPos);
-	if (aPos==iCurrentPos.iPos)
-		return;
+    {
+    __PRINT1(_L("CFatFileCB::CheckPosL(%d)"), aPos);
+    if (aPos==iCurrentPos.iPos)
+        return;
     __ASSERT_DEBUG(aPos <= FCB_FileSize(), Fault(EFatFilePosBeyondEnd));
 
-	if (FileSizeModified() && IsSeekBackwards(aPos))
-		FlushDataL(); 
-	
-	TUint newRelCluster=aPos>>ClusterSizeLog2();
-	if ( aPos && (aPos==(newRelCluster<<ClusterSizeLog2())) )
-		newRelCluster--;
-	TUint oldRelCluster=iCurrentPos.iPos>>ClusterSizeLog2();
-	
-	if ( iCurrentPos.iPos && (iCurrentPos.iPos==(oldRelCluster<<ClusterSizeLog2())) )
-		oldRelCluster--;	
-	
-	TInt clusterOffset=newRelCluster-oldRelCluster;
-	TUint32 oldCluster=iCurrentPos.iCluster;
+    if (FileSizeModified() && IsSeekBackwards(aPos))
+        FlushDataL(); 
+    
+    TUint newRelCluster=aPos>>ClusterSizeLog2();
+    if ( aPos && (aPos==(newRelCluster<<ClusterSizeLog2())) )
+        newRelCluster--;
+    TUint oldRelCluster=iCurrentPos.iPos>>ClusterSizeLog2();
+    
+    if ( iCurrentPos.iPos && (iCurrentPos.iPos==(oldRelCluster<<ClusterSizeLog2())) )
+        oldRelCluster--;    
+    
+    TInt clusterOffset=newRelCluster-oldRelCluster;
+    TUint32 oldCluster=iCurrentPos.iCluster;
 
-	iCurrentPos.iPos=aPos;
-	if (clusterOffset==0)
-		return;
-	TInt seekOffset=clusterOffset;
-	if (iSeekIndex!=NULL)
-		{ // Can alter iCurrentPos.iCluster
-		seekOffset=SeekToPosition(newRelCluster,seekOffset);
-		if (seekOffset==0)
-			return;
-		}
-	if (clusterOffset==-1 && seekOffset!=1)
-		{ // Check previous cluster
-		TUint32 cluster=oldCluster-1;
-		if (FAT().GetNextClusterL(cluster) && cluster==oldCluster)
-			{
+    iCurrentPos.iPos=aPos;
+    if (clusterOffset==0)
+        return;
+    TInt seekOffset=clusterOffset;
+    if (iSeekIndex!=NULL)
+        { // Can alter iCurrentPos.iCluster
+        seekOffset=SeekToPosition(newRelCluster,seekOffset);
+        if (seekOffset==0)
+            return;
+        }
+    if (clusterOffset==-1 && seekOffset!=1)
+        { // Check previous cluster
+        TUint32 cluster=oldCluster-1;
+        if (FAT().GetNextClusterL(cluster) && cluster==oldCluster)
+            {
             iCurrentPos.iCluster=oldCluster-1;
-			return;
-			}
-		}
-	if (seekOffset<0)
-		{
-		seekOffset=newRelCluster;
-		iCurrentPos.iCluster=FCB_StartCluster();
-		}
-	while (seekOffset--)
-		{
+            return;
+            }
+        }
+    if (seekOffset<0)
+        {
+        seekOffset=newRelCluster;
+        iCurrentPos.iCluster=FCB_StartCluster();
+        }
+    while (seekOffset--)
+        {
         if (!FAT().GetNextClusterL(iCurrentPos.iCluster))
             {
             __PRINT(_L("CFatFileCB::CheckPosL() corrupt#1"));
             User::Leave(KErrCorrupt);
             }
         TInt cluster=newRelCluster-seekOffset;
-		if (iSeekIndex!=NULL && cluster && (cluster>>iSeekIndexSize)<<iSeekIndexSize==cluster)
-			SetSeekIndexValueL(cluster,iCurrentPos.iCluster);
-		}
-	}
+        if (iSeekIndex!=NULL && cluster && (cluster>>iSeekIndexSize)<<iSeekIndexSize==cluster)
+            SetSeekIndexValueL(cluster,iCurrentPos.iCluster);
+        }
+    }
 
 //-----------------------------------------------------------------------------
 /** 
@@ -185,21 +185,21 @@
     @param  aFileDosEntryPos    this file DOS entry dir. iterator in the parent directory.
 */
 void CFatFileCB::SetupL(const TFatDirEntry& aFatDirEntry, const TEntryPos& aFileDosEntryPos)
-	{
-	__PRINT1(_L("CFatFileCB::SetupL[0x%x]"), this);
-	
+    {
+    __PRINT1(_L("CFatFileCB::SetupL[0x%x]"), this);
+    
 
     //-- set up a file control block
-	iCurrentPos.iCluster= FatMount().StartCluster(aFatDirEntry);
-	iCurrentPos.iPos=0;
-	
+    iCurrentPos.iCluster= FatMount().StartCluster(aFatDirEntry);
+    iCurrentPos.iPos=0;
+    
     SetAtt(aFatDirEntry.Attributes());
-	SetModified(aFatDirEntry.Time(FatMount().TimeOffset()));
+    SetModified(aFatDirEntry.Time(FatMount().TimeOffset()));
     
     FCB_SetStartCluster(iCurrentPos.iCluster);
     FCB_SetFileSize(aFatDirEntry.Size()); 
 
-	iFileDosEntryPos = aFileDosEntryPos;
+    iFileDosEntryPos = aFileDosEntryPos;
 
     SetMaxSupportedSize(KMaxSupportedFatFileSize);
 
@@ -213,7 +213,7 @@
     IndicateFileAttModified(EFalse);
     IndicateFileSizeModified(EFalse);
     IndicateFileTimeModified(EFalse);
-	}
+    }
 
 //-----------------------------------------------------------------------------
 /**
@@ -229,22 +229,22 @@
 
 */
 void CFatFileCB::ReadL(TInt64 aPos,TInt& aLength, TDes8* aDes, const RMessagePtr2& aMessage, TInt aOffset)
-	{
-	__PRINT3(_L("CFatFileCB::ReadL[0x%x] pos=%LU len=%d"), this, aPos, aLength);
-	
+    {
+    __PRINT3(_L("CFatFileCB::ReadL[0x%x] pos=%LU len=%d"), this, aPos, aLength);
+    
     if((TUint64)aPos > KMaxSupportedFatFileSize-1)
         User::Leave(KErrNotSupported);  //-- max. position in the file is 0xFFFFFFFE
 
     FatMount().CheckStateConsistentL();
     
-	CheckPosL(I64LOW(aPos));
-	
-	const TUint startPos = iCurrentPos.iPos;
-	const TUint curSize  = FCB_FileSize();
-	const TUint length   = (TUint)aLength;
-	
-	if((startPos + length > curSize) || (startPos > startPos + length) )
-		aLength=curSize-startPos;
+    CheckPosL(I64LOW(aPos));
+    
+    const TUint startPos = iCurrentPos.iPos;
+    const TUint curSize  = FCB_FileSize();
+    const TUint length   = (TUint)aLength;
+    
+    if((startPos + length > curSize) || (startPos > startPos + length) )
+        aLength=curSize-startPos;
 		
 	TUint flag = DirectIOMode(aMessage) ? RLocalDrive::ELocDrvDirectIO : 0;
 	
@@ -254,9 +254,9 @@
 
 
 void CFatFileCB::ReadL(TInt aFilePos,TInt& aLength,const TAny* aTrg,const RMessagePtr2& aMessage)
-	{
-	ReadL(TInt64(aFilePos),aLength,(TDes8*) aTrg,aMessage, 0);
-	}
+    {
+    ReadL(TInt64(aFilePos),aLength,(TDes8*) aTrg,aMessage, 0);
+    }
 
 //-----------------------------------------------------------------------------
 /**
@@ -272,117 +272,117 @@
 
 */
 void CFatFileCB::WriteL(TInt64 aPos,TInt& aLength,const TDesC8* aSrc,const RMessagePtr2& aMessage, TInt aOffset)
-	{
-	__PRINT3(_L("CFatFileCB::WriteL[0x%x] pos=%LU len=%d"), this, aPos, aLength);
+    {
+    __PRINT3(_L("CFatFileCB::WriteL[0x%x] pos=%LU len=%d"), this, aPos, aLength);
 
-	// FAT supports 32 bits only for file size
-   	TUint64 endPos = aPos + aLength;
-   	if(endPos > KMaxSupportedFatFileSize)
-   		User::Leave(KErrNotSupported);
-   	
+    // FAT supports 32 bits only for file size
+    TUint64 endPos = aPos + aLength;
+    if(endPos > KMaxSupportedFatFileSize)
+        User::Leave(KErrNotSupported);
+    
     FatMount().CheckStateConsistentL();
     FatMount().CheckWritableL();
     const TUint pos = I64LOW(aPos);
-  	CheckPosL(pos);
-  	
-	const TUint startCluster = FCB_StartCluster();
-	const TUint length       = (TUint)aLength;
-	
-	endPos = iCurrentPos.iPos + length; 
-	if ((endPos           > FCB_FileSize()) ||
-	    (iCurrentPos.iPos > endPos)         ) // Overflow condition 
-		DoSetSizeL(iCurrentPos.iPos+length,EFalse);
-   	
-	TUint startPos=iCurrentPos.iPos;
-	TUint badcluster=0;
-	TUint goodcluster=0;
+    CheckPosL(pos);
+    
+    const TUint startCluster = FCB_StartCluster();
+    const TUint length       = (TUint)aLength;
+    
+    endPos = iCurrentPos.iPos + length; 
+    if ((endPos           > FCB_FileSize()) ||
+        (iCurrentPos.iPos > endPos)         ) // Overflow condition 
+        DoSetSizeL(iCurrentPos.iPos+length,EFalse);
+    
+    TUint startPos=iCurrentPos.iPos;
+    TUint badcluster=0;
+    TUint goodcluster=0;
    	
 	TUint flag = DirectIOMode(aMessage) ? RLocalDrive::ELocDrvDirectIO : 0;
 	
 	TRAPD(ret, FatMount().WriteToClusterListL(iCurrentPos,aLength,aSrc,aMessage,aOffset,badcluster, goodcluster, flag));
    	
-	if (ret == KErrCorrupt || ret == KErrDied)
-		{
+    if (ret == KErrCorrupt || ret == KErrDied)
+        {
         if(startCluster == 0)
-			{ //Empty File, revert all the clusters allocated.
-			const TUint32 cluster = FCB_StartCluster();
-			FCB_SetStartCluster(0);
-			FCB_SetFileSize(0);
-			IndicateFileSizeModified(ETrue);
+            { //Empty File, revert all the clusters allocated.
+            const TUint32 cluster = FCB_StartCluster();
+            FCB_SetStartCluster(0);
+            FCB_SetFileSize(0);
+            IndicateFileSizeModified(ETrue);
             
-			FlushAllL();
+            FlushAllL();
 
-			iCurrentPos.iCluster = 0;
-			iCurrentPos.iPos = 0;
+            iCurrentPos.iCluster = 0;
+            iCurrentPos.iPos = 0;
 
-			FAT().FreeClusterListL(cluster);
-			FAT().FlushL();
-			}
-		else
-			{ //Calculate the clusters required based on file size, revert extra clusters if allocated.
-			const TUint curSize = FCB_FileSize();
-			TUint ClustersNeeded = curSize >> ClusterSizeLog2();
-			if(curSize > (ClustersNeeded << ClusterSizeLog2()))
-				{
-				ClustersNeeded++;
-				}
+            FAT().FreeClusterListL(cluster);
+            FAT().FlushL();
+            }
+        else
+            { //Calculate the clusters required based on file size, revert extra clusters if allocated.
+            const TUint curSize = FCB_FileSize();
+            TUint ClustersNeeded = curSize >> ClusterSizeLog2();
+            if(curSize > (ClustersNeeded << ClusterSizeLog2()))
+                {
+                ClustersNeeded++;
+                }
 
-			TUint32 cluster = FCB_StartCluster();
-			while(--ClustersNeeded)
-				{
-				FAT().GetNextClusterL(cluster);
-				}
+            TUint32 cluster = FCB_StartCluster();
+            while(--ClustersNeeded)
+                {
+                FAT().GetNextClusterL(cluster);
+                }
                 
-			iCurrentPos.iCluster = cluster;
+            iCurrentPos.iCluster = cluster;
 
-			if (FAT().GetNextClusterL(cluster))
-				{
-				FAT().FreeClusterListL(cluster);
-				}
+            if (FAT().GetNextClusterL(cluster))
+                {
+                FAT().FreeClusterListL(cluster);
+                }
 
-			FAT().WriteFatEntryEofL(iCurrentPos.iCluster);
-			FAT().FlushL();
-			}
-		}
+            FAT().WriteFatEntryEofL(iCurrentPos.iCluster);
+            FAT().FlushL();
+            }
+        }
 
-	User::LeaveIfError(ret);
+    User::LeaveIfError(ret);
 
-	if(badcluster != 0)
-		{
-		if(FCB_StartCluster() == badcluster)
-			{
+    if(badcluster != 0)
+        {
+        if(FCB_StartCluster() == badcluster)
+            {
             FCB_SetStartCluster(goodcluster);
-			FlushStartClusterL();
-			}
-		else
-			{
-			TUint32 aCluster = FCB_StartCluster();
-			do
-				{
+            FlushStartClusterL();
+            }
+        else
+            {
+            TUint32 aCluster = FCB_StartCluster();
+            do
+                {
                 if((TUint)badcluster == FAT().ReadL(aCluster))
-					{
-					FAT().WriteL(aCluster, goodcluster);
-					FAT().FlushL();
-					break;
-					}
-				}
-			while(FAT().GetNextClusterL(aCluster));
-			}
-		}
-	aLength=iCurrentPos.iPos-startPos;
+                    {
+                    FAT().WriteL(aCluster, goodcluster);
+                    FAT().FlushL();
+                    break;
+                    }
+                }
+            while(FAT().GetNextClusterL(aCluster));
+            }
+        }
+    aLength=iCurrentPos.iPos-startPos;
 
-	if(!IsSequentialMode() && FatMount().IsRuggedFSys() && pos+(TUint)aLength > FCB_FileSize())
-		{
-		WriteFileSizeL(pos+aLength);
-		}
+    if(!IsSequentialMode() && FatMount().IsRuggedFSys() && pos+(TUint)aLength > FCB_FileSize())
+        {
+        WriteFileSizeL(pos+aLength);
+        }
 
-	}
+    }
 
 
 void CFatFileCB::WriteL(TInt aFilePos,TInt& aLength,const TAny* aSrc,const RMessagePtr2& aMessage)
-	{
-	WriteL(TInt64(aFilePos),aLength,(TDesC8*) aSrc,aMessage, 0);
-	}
+    {
+    WriteL(TInt64(aFilePos),aLength,(TDesC8*) aSrc,aMessage, 0);
+    }
 
 
 //-----------------------------------------------------------------------------
@@ -392,58 +392,58 @@
 // Resize the seek index to accomodate a larger or smaller filesize
 // Assumes KSeekIndexSize is a power of 2.
 //
-	{
+    {
 
-	TInt maxNewIndex=aNewSize>>(ClusterSizeLog2()+aNewMult);
+    TInt maxNewIndex=aNewSize>>(ClusterSizeLog2()+aNewMult);
 
 
-	TInt    index=0;
-	TInt	indexEnd=KSeekIndexSize;
-	TInt	newValEnd=maxNewIndex;
+    TInt    index=0;
+    TInt    indexEnd=KSeekIndexSize;
+    TInt    newValEnd=maxNewIndex;
 
-	if (iSeekIndexSize<aNewMult)
-		{
-		TInt newVal=index;
-		TInt step=1<<(aNewMult-iSeekIndexSize);
-		index+=step-1;
-		while(index<indexEnd && newVal<newValEnd)
-			{
-			iSeekIndex[newVal] =  iSeekIndex[index];
-			newVal++;
-			index+=step;
-			}
-		while(newVal<indexEnd)
-			iSeekIndex[newVal++] =  0;
-		}
-	else
-		{
-		TInt diffSize = iSeekIndexSize-aNewMult;
-		TInt oldVal=(KSeekIndexSize>>diffSize) - 1;
-		TInt newVal=indexEnd-1;
-		TInt skip=(1<<diffSize)-1;
+    if (iSeekIndexSize<aNewMult)
+        {
+        TInt newVal=index;
+        TInt step=1<<(aNewMult-iSeekIndexSize);
+        index+=step-1;
+        while(index<indexEnd && newVal<newValEnd)
+            {
+            iSeekIndex[newVal] =  iSeekIndex[index];
+            newVal++;
+            index+=step;
+            }
+        while(newVal<indexEnd)
+            iSeekIndex[newVal++] =  0;
+        }
+    else
+        {
+        TInt diffSize = iSeekIndexSize-aNewMult;
+        TInt oldVal=(KSeekIndexSize>>diffSize) - 1;
+        TInt newVal=indexEnd-1;
+        TInt skip=(1<<diffSize)-1;
 
-		if ((iSeekIndexSize - aNewMult) > KSeekIndexSizeLog2)
-			{
+        if ((iSeekIndexSize - aNewMult) > KSeekIndexSizeLog2)
+            {
             ClearIndex(0); //-- Invalidate every entry.
-			}
-		else
-			{
-			while(newVal>=index)
-				{
+            }
+        else
+            {
+            while(newVal>=index)
+                {
 
-				iSeekIndex[newVal--] =  iSeekIndex[oldVal--];
+                iSeekIndex[newVal--] =  iSeekIndex[oldVal--];
 
 
-				for(TInt i=skip;i>0;i--)
-					{	
-					iSeekIndex[newVal--] = 0;
+                for(TInt i=skip;i>0;i--)
+                    {   
+                    iSeekIndex[newVal--] = 0;
 
-					}
-				}
-			}
-		}
-	iSeekIndexSize=aNewMult;
-	}
+                    }
+                }
+            }
+        }
+    iSeekIndexSize=aNewMult;
+    }
 
 
 /**
@@ -453,44 +453,44 @@
             if = 0  all existing index will be zero filled
 */ 
 void CFatFileCB::ClearIndex(TUint aNewSize)
-	{
+    {
 
-	if (!iSeekIndex)
-	    return;
+    if (!iSeekIndex)
+        return;
 
     if(aNewSize==0)
-    	{
-    	//-- zero fill all the array
+        {
+        //-- zero fill all the array
         Mem::FillZ(iSeekIndex, KSeekIndexSize*sizeof(TUint32));
-		return;
-    	}
+        return;
+        }
 
-	// Files that fill up a cluster exactly do not have a trailing empty
-	// cluster. So the entry for that position must also be invalidated
-	aNewSize--;
-	TInt firstInvalidIndex=aNewSize>>(iSeekIndexSize+ClusterSizeLog2());
-		
-	TInt indexLen=KSeekIndexSize-firstInvalidIndex;
+    // Files that fill up a cluster exactly do not have a trailing empty
+    // cluster. So the entry for that position must also be invalidated
+    aNewSize--;
+    TInt firstInvalidIndex=aNewSize>>(iSeekIndexSize+ClusterSizeLog2());
+        
+    TInt indexLen=KSeekIndexSize-firstInvalidIndex;
 
-	Mem::FillZ(iSeekIndex+firstInvalidIndex, indexLen * sizeof(TUint32));
-	}
+    Mem::FillZ(iSeekIndex+firstInvalidIndex, indexLen * sizeof(TUint32));
+    }
 
 TInt CFatFileCB::CalcSeekIndexSize(TUint aSize)
 //
 // Find the nearest power of 2 > aSize
 //
-	{
-	TInt count = 0;
-	const TUint indexSize=KSeekIndexSize<<ClusterSizeLog2();//KSeekIndexSize=128
-	if (aSize<=indexSize)
-	  return(count);
-	
-	while((aSize>>=1)>0)
-		{
-		count++;
-		}
-	return (count - (KSeekIndexSizeLog2 + ClusterSizeLog2()) + 1);
-	}
+    {
+    TInt count = 0;
+    const TUint indexSize=KSeekIndexSize<<ClusterSizeLog2();//KSeekIndexSize=128
+    if (aSize<=indexSize)
+      return(count);
+    
+    while((aSize>>=1)>0)
+        {
+        count++;
+        }
+    return (count - (KSeekIndexSizeLog2 + ClusterSizeLog2()) + 1);
+    }
 
 //-----------------------------------------------------------------------------
 /**
@@ -498,21 +498,21 @@
     @param aSize new file size.
 */
 void CFatFileCB::SetSizeL(TInt64 aSize)
-	{
-	__PRINT2(_L("CFatFileCB::SetSizeL[0x%x] sz=%LU"), this, aSize);
-	
-	//-- max. file size for FAT is 4GB-1
-	if (I64HIGH(aSize))
-		User::Leave(KErrNotSupported);
+    {
+    __PRINT2(_L("CFatFileCB::SetSizeL[0x%x] sz=%LU"), this, aSize);
+    
+    //-- max. file size for FAT is 4GB-1
+    if (I64HIGH(aSize))
+        User::Leave(KErrNotSupported);
 
-	DoSetSizeL(I64LOW(aSize), FatMount().IsRuggedFSys());
-	}
+    DoSetSizeL(I64LOW(aSize), FatMount().IsRuggedFSys());
+    }
 
 
 void CFatFileCB::SetSizeL(TInt aSize)
-	{
-	SetSizeL(TInt64(aSize));
-	}
+    {
+    SetSizeL(TInt64(aSize));
+    }
 
 //-----------------------------------------------------------------------------
 /**
@@ -520,22 +520,22 @@
 */
 void CFatFileCB::DoShrinkFileToZeroSizeL()
     {
-	    ASSERT(FCB_FileSize());
+        ASSERT(FCB_FileSize());
         ASSERT(FileSizeModified());
         
         ClearIndex(0); // Clear seek index array
-		
+        
         //-- update file dir. entry
         const TUint32 cluster = FCB_StartCluster();
-		FCB_SetStartCluster(0);
-		FCB_SetFileSize(0);
-			FlushAllL();
-		
+        FCB_SetStartCluster(0);
+        FCB_SetFileSize(0);
+            FlushAllL();
+        
         //-- free cluster list. 
-			CheckPosL(0);
-			FAT().FreeClusterListL(cluster);
-			FAT().FlushL();
-			}
+            CheckPosL(0);
+            FAT().FreeClusterListL(cluster);
+            FAT().FlushL();
+            }
 
 //-----------------------------------------------------------------------------
 /*
@@ -545,35 +545,36 @@
     @param aForceCachesFlush if ETrue, all file/FAT caches will be flushed 
 */
 void CFatFileCB::DoShrinkFileL(TUint32 aNewSize, TBool aForceCachesFlush)
-		{
+    {
     ASSERT(FileSizeModified());
     ASSERT(FCB_FileSize() > aNewSize && aNewSize);
-	
-    if(aForceCachesFlush)		
+    
+    if(aForceCachesFlush)       
         WriteFileSizeL(aNewSize); //-- write file size directly to its dir. entry
 
-	CheckPosL(aNewSize);
-	
+    CheckPosL(aNewSize);
+
     TUint32 cluster=iCurrentPos.iCluster;
-		if (FAT().GetNextClusterL(cluster))
-	    {//-- truncate the cluster chain
-			FAT().WriteFatEntryEofL(iCurrentPos.iCluster);
-			FAT().FreeClusterListL(cluster);
-			}
-		
+    
+    if (FAT().GetNextClusterL(cluster))
+        {//-- truncate the cluster chain
+        FAT().WriteFatEntryEofL(iCurrentPos.iCluster);
+        FAT().FreeClusterListL(cluster);
+        }
+        
     ClearIndex(aNewSize);
-		FAT().FlushL();
-		}
-	
+    FAT().FlushL();
+    }
+    
 //-----------------------------------------------------------------------------
 /**
     Expand a file.
-	
+    
     @param aNewSize new file size.
     @param aForceCachesFlush if ETrue, all file/FAT caches will be flushed
 */
 void CFatFileCB::DoExpandFileL(TUint32 aNewSize, TBool aForceCachesFlush)
-		{
+    {
     ASSERT(FCB_FileSize() < aNewSize);
     ASSERT(FileSizeModified());
 
@@ -581,41 +582,41 @@
     const TUint32 newSizeClusters = (TUint32)(((TUint64)aNewSize + Pow2(KClusterSzLog2) - 1) >> KClusterSzLog2);
 
 
-	//-- expanding a file
-	if (FCB_StartCluster() == 0)
-		{//-- the initial file size is 0 (no cluster chain)
+    //-- expanding a file
+    if (FCB_StartCluster() == 0)
+        {//-- the initial file size is 0 (no cluster chain)
          
         ClearIndex(0); //-- clear seek index array
         //-- FAT().FreeClusterHint() will give us a hint of the last free cluster
         const TUint32 tempStartCluster=FAT().AllocateClusterListL(newSizeClusters, FAT().FreeClusterHint()); 
-		FAT().FlushL();
+        FAT().FlushL();
 
-		iCurrentPos.iCluster=tempStartCluster;
-		FCB_SetStartCluster(tempStartCluster);
-		FCB_SetFileSize(aNewSize);
-		FlushAllL();
-		}
-	else
-		{
-		const TUint curSize = FCB_FileSize(); 
-	    const TUint32 oldSizeClusters = ((curSize + Pow2(KClusterSzLog2) - 1) >> KClusterSzLog2);
+        iCurrentPos.iCluster=tempStartCluster;
+        FCB_SetStartCluster(tempStartCluster);
+        FCB_SetFileSize(aNewSize);
+        FlushAllL();
+        }
+    else
+        {
+        const TUint curSize = FCB_FileSize(); 
+        const TUint32 oldSizeClusters = ((curSize + Pow2(KClusterSzLog2) - 1) >> KClusterSzLog2);
         ASSERT(newSizeClusters >= oldSizeClusters);
-		const TUint newClusters = newSizeClusters-oldSizeClusters;	//-- Number of clusters we need to append to the existing cluster chain
-		if (newClusters)
-			{
-			TEntryPos currentPos=iCurrentPos;
-			CheckPosL(FCB_FileSize());
-			FAT().ExtendClusterListL(newClusters,iCurrentPos.iCluster);
-			iCurrentPos=currentPos;
-			}
-	
-		FAT().FlushL();
-		
-        if(!IsSequentialMode() && aForceCachesFlush)	// Write file size directly to its dir. entry if a cache flush
-			WriteFileSizeL(aNewSize);				// is needed and rugged FAT is not ignored by client
-		}
+        const TUint newClusters = newSizeClusters-oldSizeClusters;  //-- Number of clusters we need to append to the existing cluster chain
+        if (newClusters)
+            {
+            TEntryPos currentPos=iCurrentPos;
+            CheckPosL(FCB_FileSize());
+            FAT().ExtendClusterListL(newClusters,iCurrentPos.iCluster);
+            iCurrentPos=currentPos;
+            }
+    
+        FAT().FlushL();
+        
+        if(!IsSequentialMode() && aForceCachesFlush)    // Write file size directly to its dir. entry if a cache flush
+            WriteFileSizeL(aNewSize);               // is needed and rugged FAT is not ignored by client
+        }
 
-	}
+    }
 
 //-----------------------------------------------------------------------------
 /**
@@ -625,21 +626,22 @@
                                 it is used in Rugged FAT mode.
 */
 void CFatFileCB::DoSetSizeL(TUint aSize, TBool aForceCachesFlush)
-	{
-	__PRINT4(_L("CFatFileCB::DoSetSizeL[0x%x] sz:%d, oldSz:%d, flush:%d"), this, aSize, FCB_FileSize(), aForceCachesFlush);
+    {
+    __PRINT4(_L("CFatFileCB::DoSetSizeL[0x%x] sz:%d, oldSz:%d, flush:%d"), this, aSize, FCB_FileSize(), aForceCachesFlush);
 
     FatMount().CheckStateConsistentL();
     FatMount().CheckWritableL();
 
-	
-	// Can not change the file size if it is clamped
-	if(Mount().IsFileClamped(MAKE_TINT64(0,FCB_StartCluster())) > 0)
-		User::Leave(KErrInUse);
-	
-	if(aSize == FCB_FileSize())
+    
+    // Can not change the file size if it is clamped
+    if(Mount().IsFileClamped(MAKE_TINT64(0,FCB_StartCluster())) > 0)
+        User::Leave(KErrInUse);
+    
+    if(aSize == FCB_FileSize())
         return;
 
     IndicateFileSizeModified(ETrue);
+	IndicateFileAttModified(ETrue);		// ensure file size is flushed
 
 	TInt newIndexMult=CalcSeekIndexSize(aSize);
 	if (iSeekIndex!=NULL && newIndexMult!=iSeekIndexSize)
@@ -654,18 +656,18 @@
         }
 
     //-------------------------------------------
-	//-- shrinking file to non-zero size
+    //-- shrinking file to non-zero size
     if (aSize < FCB_FileSize())
-		{
+        {
         DoShrinkFileL(aSize, aForceCachesFlush);
         return;
         }
     
     //-------------------------------------------
-	//-- expanding a file
+    //-- expanding a file
     DoExpandFileL(aSize, aForceCachesFlush);
 
-	}
+    }
 
 //-----------------------------------------------------------------------------
 /**
@@ -679,33 +681,37 @@
 
 */
 void CFatFileCB::SetEntryL(const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask)
-	{
-	__PRINT1(_L("CFatFileCB::SetEntryL[0x%x]"), this);
+    {
+    __PRINT1(_L("CFatFileCB::SetEntryL[0x%x]"), this);
     
     FatMount().CheckStateConsistentL();
     FatMount().CheckWritableL();
 
     //-- change file attributes
     const TUint setAttMask = (aSetAttMask & KEntryAttMaskSupported); //-- supported attributes to set
-    TUint newAtt = Att();
+	TUint oldAtt = Att();
+	TUint newAtt = oldAtt;
 
 	if (setAttMask|aClearAttMask)
 		{
         newAtt |= setAttMask;
         newAtt &= ~aClearAttMask;
-        SetAtt(newAtt);
-        IndicateFileAttModified(ETrue); //-- indicate that file attributes have changed
+		if (newAtt != oldAtt)
+			{
+	        SetAtt(newAtt);
+		    IndicateFileAttModified(ETrue); //-- indicate that file attributes have changed
+			}
 		}
     
     //-- set file entry modification time if required
 	if (aSetAttMask&KEntryAttModified)
-	{
+		{
         SetModified(aTime);        //-- set file modified time
         IndicateFileAttModified(ETrue); //-- indicate that file attributes have changed
         IndicateFileTimeModified(ETrue); //-- this will force writing file mod. time to the media on Flush
         }
 
-	}
+    }
 
 
 //-----------------------------------------------------------------------------
@@ -713,39 +719,39 @@
     The same as FlushAllL(). This method is called from RFile::Flush()
 */
 void CFatFileCB::FlushDataL()
-	{
-	__PRINT1(_L("CFatFileCB::FlushDataL[0x%x]"), this);
+    {
+    __PRINT1(_L("CFatFileCB::FlushDataL[0x%x]"), this);
     FlushAllL();
-	}
+    }
 
 //-----------------------------------------------------------------------------
 /** 
     Flush the fide directory entry data: files size, attributes, time etc. 
 */
 void CFatFileCB::FlushAllL()
-	{
+    {
 
     //-- define this symbol in order to enable legacy behaviour, i.e. compulsory updating file dir. entry on flush.
     //-- otherwise the FlushAllL() will update the file dir. entry only if it differs from what is on the media, i.e.
     //-- file size, start cluster, attributes and modification timestamp
     #define ALWAYS_UPDATE_ENTRY_ON_FLUSH
 
-	__PRINT1(_L("CFatFileCB::FlushAllL[0x%x]"), this);
+    __PRINT1(_L("CFatFileCB::FlushAllL[0x%x]"), this);
 
     if (Mount().IsCurrentMount()==EFalse)
-		User::Leave(KErrDisMounted);
+        User::Leave(KErrDisMounted);
 
     FatMount().CheckStateConsistentL();
     FatMount().CheckWritableL();
 
-	if(!FileSizeModified() && !FileAttModified() && !FileTimeModified())
+    if(!FileSizeModified() && !FileAttModified() && !FileTimeModified())
         return; //-- nothing has changed in the file entry at all
 
 
     //-- read file dir. entry
-	TFatDirEntry entry;
-	FatMount().ReadDirEntryL(iFileDosEntryPos,entry);
-	__ASSERT_ALWAYS(entry.IsEndOfDirectory()==EFalse,User::Leave(KErrCorrupt));
+    TFatDirEntry entry;
+    FatMount().ReadDirEntryL(iFileDosEntryPos,entry);
+    __ASSERT_ALWAYS(entry.IsEndOfDirectory()==EFalse,User::Leave(KErrCorrupt));
 
     //-- the problem with KEntryAttModified here is that the file server uses this flag to 
     //-- deal with dirty file data. This means that this flag can be set even if there were no changes
@@ -776,35 +782,35 @@
 
     if(bUpdateDirEntry)
         {//-- write entry to the media
-	    __PRINT(_L("  CFatFileCB::FlushAllL #1"));
+        __PRINT(_L("  CFatFileCB::FlushAllL #1"));
         entry.SetAttributes(Att() & KEntryAttMaskSupported);
-	    entry.SetSize(FCB_FileSize());
-	    entry.SetTime(iModified, timeOffset);
-	    
+        entry.SetSize(FCB_FileSize());
+        entry.SetTime(iModified, timeOffset);
+        
         entry.SetStartCluster(FCB_StartCluster());
 
 	    const TBool setNotify = FatMount().GetNotifyUser();
-	if(setNotify)
-		{
-		FatMount().SetNotifyOff();	// do not launch a notifier
-		}
+		if(setNotify)
+			{
+			FatMount().SetNotifyOff();	// do not launch a notifier
+			}
 
-	    TRAPD(ret, FatMount().WriteDirEntryL(iFileDosEntryPos,entry));
-	
-	if(setNotify)
-		{
-		FatMount().SetNotifyOn();
-		}
+			TRAPD(ret, FatMount().WriteDirEntryL(iFileDosEntryPos,entry));
+		
+		if(setNotify)
+			{
+			FatMount().SetNotifyOn();
+			}
 
-	User::LeaveIfError(ret);
+		User::LeaveIfError(ret);
 
-        IndicateFileSizeModified(EFalse);
-        IndicateFileTimeModified(EFalse);
+		IndicateFileSizeModified(EFalse);
+		IndicateFileTimeModified(EFalse);
 	    }
 
 
-        //-- KEntryAttModified must be reset anyway
-        IndicateFileAttModified(EFalse); 
+    //-- KEntryAttModified must be reset anyway
+    IndicateFileAttModified(EFalse); 
 	}
 
 //-----------------------------------------------------------------------------
@@ -814,7 +820,7 @@
     @param  aNewName new file name; all trailing dots from the name will be removed
 */
 void CFatFileCB::RenameL(const TDesC& aNewName)
-	{
+    {
     __PRINT2(_L("CFatFileCB::RenameL[0x%x], name:%S"),this, &aNewName);
 
     FatMount().CheckStateConsistentL();
@@ -823,97 +829,97 @@
     const TPtrC fileName = RemoveTrailingDots(aNewName); //-- remove trailing dots from the name
 
 
-	FatMount().DoRenameOrReplaceL(*iFileName, fileName, CFatMountCB::EModeRename, iFileDosEntryPos);
-	
+    FatMount().DoRenameOrReplaceL(*iFileName, fileName, CFatMountCB::EModeRename, iFileDosEntryPos);
+    
     AllocBufferL(iFileName, fileName);
-	
-	if(!FatMount().IsRuggedFSys())
-		FAT().FlushL();
-	}
+    
+    if(!FatMount().IsRuggedFSys())
+        FAT().FlushL();
+    }
 
 
 //***********************************************************
 //* BlockMap interface
 //***********************************************************
-	
+    
 TInt CFatFileCB::BlockMap(SBlockMapInfo& aInfo, TInt64& aStartPos, TInt64 aEndPos)
 //
 // Retrieves the block map of a given section of the file, in the FAT file system.
-//	
-	{
-	__PRINT2(_L("CFatFileCB::BlockMap aStartPos=%ld aEndPos=%ld"), aStartPos, aEndPos);
-	
-	if ( I64HIGH(aStartPos) || I64HIGH(aEndPos) )
-		return KErrNotSupported;
+//  
+    {
+    __PRINT2(_L("CFatFileCB::BlockMap aStartPos=%ld aEndPos=%ld"), aStartPos, aEndPos);
+    
+    if ( I64HIGH(aStartPos) || I64HIGH(aEndPos) )
+        return KErrNotSupported;
 
     TUint startPos = I64LOW(aStartPos);
-	TUint endPos = I64LOW(aEndPos);
+    TUint endPos = I64LOW(aEndPos);
 
-	// aEndPos will always be >=0 at this point
-	const TUint length = endPos - startPos;
-	
-	// Store the position of cluster zero in aInfo
-	CFatMountCB& fatMount = FatMount();
+    // aEndPos will always be >=0 at this point
+    const TUint length = endPos - startPos;
+    
+    // Store the position of cluster zero in aInfo
+    CFatMountCB& fatMount = FatMount();
 
-	TInt drvNo=-1;
-	TBusLocalDrive* locDrv;
-	if((fatMount.LocalDrive()->GetLocalDrive(locDrv)==KErrNone) && ((drvNo=GetLocalDriveNumber(locDrv))>=0) && (drvNo<KMaxLocalDrives))
-		aInfo.iLocalDriveNumber=drvNo;
-	else
-		return KErrNotSupported;
+    TInt drvNo=-1;
+    TBusLocalDrive* locDrv;
+    if((fatMount.LocalDrive()->GetLocalDrive(locDrv)==KErrNone) && ((drvNo=GetLocalDriveNumber(locDrv))>=0) && (drvNo<KMaxLocalDrives))
+        aInfo.iLocalDriveNumber=drvNo;
+    else
+        return KErrNotSupported;
 
-	// Fetch the address of cluster 0
-	aInfo.iStartBlockAddress = fatMount.FAT().DataPositionInBytes(KFirstClusterNum);
+    // Fetch the address of cluster 0
+    aInfo.iStartBlockAddress = fatMount.FAT().DataPositionInBytes(KFirstClusterNum);
 
-	TRAPD(r, CheckPosL(startPos));
-	if (r != KErrNone)
-		return r;
+    TRAPD(r, CheckPosL(startPos));
+    if (r != KErrNone)
+        return r;
 
-	aInfo.iBlockStartOffset = fatMount.ClusterRelativePos(iCurrentPos.iPos);
-	aInfo.iBlockGranularity = 1 << FatMount().ClusterSizeLog2();
-	const TUint myStartPos = iCurrentPos.iPos;
-	if ( myStartPos + length > FCB_FileSize())
-		return KErrArgument;
+    aInfo.iBlockStartOffset = fatMount.ClusterRelativePos(iCurrentPos.iPos);
+    aInfo.iBlockGranularity = 1 << FatMount().ClusterSizeLog2();
+    const TUint myStartPos = iCurrentPos.iPos;
+    if ( myStartPos + length > FCB_FileSize())
+        return KErrArgument;
 
-	TRAP(r, FatMount().BlockMapReadFromClusterListL(iCurrentPos, length, aInfo));
-	if (r != KErrNone)
-		return r;
+    TRAP(r, FatMount().BlockMapReadFromClusterListL(iCurrentPos, length, aInfo));
+    if (r != KErrNone)
+        return r;
 
-	aStartPos = iCurrentPos.iPos;
-	if ((I64LOW(aStartPos) == FCB_FileSize()) || ( I64LOW(aStartPos) == (myStartPos + length)))
-		return KErrCompletion;
-	else
-		return KErrNone;
-	}
+    aStartPos = iCurrentPos.iPos;
+    if ((I64LOW(aStartPos) == FCB_FileSize()) || ( I64LOW(aStartPos) == (myStartPos + length)))
+        return KErrCompletion;
+    else
+        return KErrNone;
+    }
 
 
 TInt CFatFileCB::GetInterface(TInt aInterfaceId,TAny*& aInterface,TAny* aInput)
-	{
-	switch(aInterfaceId)
-		{
-		case EExtendedFileInterface:
-			((CFileCB::MExtendedFileInterface*&) aInterface) = this;
-			return KErrNone;
+    {
+    switch(aInterfaceId)
+        {
+        case EExtendedFileInterface:
+            ((CFileCB::MExtendedFileInterface*&) aInterface) = this;
+            return KErrNone;
 
-		case EBlockMapInterface:
-			aInterface = (CFileCB::MBlockMapInterface*) this;
-			return KErrNone;
+        case EBlockMapInterface:
+            aInterface = (CFileCB::MBlockMapInterface*) this;
+            return KErrNone;
 
-		case EGetLocalDrive:
-			return FatMount().LocalDrive()->GetLocalDrive((TBusLocalDrive*&) aInterface);
+        case EGetLocalDrive:
+            return FatMount().LocalDrive()->GetLocalDrive((TBusLocalDrive*&) aInterface);
 
-		default:
-			return CFileCB::GetInterface(aInterfaceId,aInterface,aInput);
-		}
-	}
+        default:
+            return CFileCB::GetInterface(aInterfaceId,aInterface,aInput);
+        }
+    }
 
 
 /**
     Overwrites file's start cluster (iStartCluster) in its directory entry.
 */
 void CFatFileCB::FlushStartClusterL()
-	{
-	__PRINT1(_L("CFatFileCB::FlushStartClusterL[0x%x]"), this);
+    {
+    __PRINT1(_L("CFatFileCB::FlushStartClusterL[0x%x]"), this);
 
     CFatMountCB& mount = FatMount();
     TFatDirEntry dirEntry;
@@ -921,21 +927,36 @@
     mount.ReadDirEntryL(iFileDosEntryPos, dirEntry); //-- read this file's dir. entry
     dirEntry.SetStartCluster(FCB_StartCluster());    //-- set new start cluster
     mount.WriteDirEntryL(iFileDosEntryPos, dirEntry);//-- write the entry back
-	}
+    }
 
 
 /**
     This is a RuggedFAT - specific method. Writes file size to the corresponding field of its file directory entry.
 */
 void CFatFileCB::WriteFileSizeL(TUint aSize)
-	{
-	__PRINT2(_L("CFatFileCB::WriteFileSizeL[0x%x], sz:%d"), this, aSize);
+    {
+    __PRINT2(_L("CFatFileCB::WriteFileSizeL[0x%x], sz:%d"), this, aSize);
 
     CFatMountCB& mount = FatMount();
     TFatDirEntry dirEntry;
 
     mount.ReadDirEntryL(iFileDosEntryPos, dirEntry); //-- read this file's dir. entry
     dirEntry.SetSize(aSize);                         //-- set new size
+
+	// As we're updating the directory entry anyway, we might as well update the attributes & time 
+	// if these have been modified to save having to update them later...
+	if (FileAttModified())
+		{
+		dirEntry.SetAttributes(Att() & KEntryAttMaskSupported);
+        IndicateFileAttModified(EFalse); 
+		IndicateFileTimeModified(ETrue);	//-- this mirrors the behaviour of CFatFileCB::~CFatFileCB()
+		}
+	if (FileTimeModified())
+		{
+		dirEntry.SetTime(iModified, FatMount().TimeOffset());
+        IndicateFileTimeModified(EFalse);
+		}
+
     mount.WriteDirEntryL(iFileDosEntryPos, dirEntry);//-- write the entry back
 
     IndicateFileSizeModified(EFalse);
--- a/userlibandfileserver/fileserver/sfat32/sl_leafdir_cache.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_leafdir_cache.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -974,7 +974,10 @@
 	{
 	RPointerArray<CLeafDirTreeNode>* nodeStack = new(ELeave) RPointerArray<CLeafDirTreeNode>(4);
 	RFs fs;
-	fs.Connect();
+	
+    TInt nRes = fs.Connect();
+    User::LeaveIfError(nRes);
+
 	const TUint32 debugRegister = DebugRegister();
 	fs.SetDebugRegister(debugRegister|KFSYS);
 	if (iRoot != NULL)
--- a/userlibandfileserver/fileserver/sfat32/sl_mnt.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfat32/sl_mnt.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -26,6 +26,7 @@
 #include "sl_dir_cache.h"
 #include "sl_scandrv.h"
 #include <hal.h>
+#include <f32dbg.h>
 
 TShortName DoGenerateShortNameL(const TDesC& aLongName,TInt& aNum,TBool aUseTildeSelectively);
 
@@ -1341,9 +1342,10 @@
     FindEntryStartL(RemoveTrailingDots(aName),KEntryAttMaskSupported,firstEntry,firstEntryPos);
     MoveToDosEntryL(firstEntryPos,firstEntry);
     TUint setAttMask=aSetAttMask&KEntryAttMaskSupported;
+	TInt oldAtt = firstEntry.Attributes();
+	TInt att = oldAtt;
     if (setAttMask|aClearAttMask)
         {
-        TInt att=firstEntry.Attributes();
         att|=setAttMask;
         att&=(~aClearAttMask);
         firstEntry.SetAttributes(att);
@@ -1352,6 +1354,8 @@
 		{
 		firstEntry.SetTime(aTime,TimeOffset());
 		}
+	else if (att == oldAtt)
+		return;					// no change - don't bother writing entry
     WriteDirEntryL(firstEntryPos,firstEntry);
     }
 
@@ -3623,23 +3627,36 @@
 		case EDisableFATDirCache:
 			{
 		    MWTCacheInterface* pDirCache = iRawDisk->DirCacheInterface();
-		    TUint32 KEDisableFATDirCache = CDynamicDirCache::EDisableCache;
+		    TUint32 KEDisableFATDirCache = MWTCacheInterface::EDisableCache;
 		    pDirCache->Control(KEDisableFATDirCache, (TUint32) aParam1, NULL);
 			break;
 			}
 		case EDumpFATDirCache:
 			{
 		    MWTCacheInterface* pDirCache = iRawDisk->DirCacheInterface();
-		    TUint32 KEDumpFATDirCache = CDynamicDirCache::EDumpCache;
-		    pDirCache->Control(KEDumpFATDirCache, 0, NULL);
+		    if (pDirCache)
+		        {
+	            TUint32 KEDumpFATDirCache = MWTCacheInterface::EDumpCache;
+	            pDirCache->Control(KEDumpFATDirCache, 0, NULL);
+		        }
 			break;
 			}
 		case EFATDirCacheInfo:
 			{
-		    MWTCacheInterface* pDirCache = iRawDisk->DirCacheInterface();
-		    TUint32 KEFATDirCacheInfo = CDynamicDirCache::ECacheInfo;
-		    pDirCache->Control(KEFATDirCacheInfo, 0, NULL);
-			break;
+			MWTCacheInterface* pDCache = iRawDisk->DirCacheInterface();
+		    if (pDCache)
+		        {
+	            TUint32 KEFATDirCacheInfo = MWTCacheInterface::ECacheInfo;
+	            TDirCacheInfo aInfo;
+	            TInt r = pDCache->Control(KEFATDirCacheInfo, 0, static_cast<TAny*>(&aInfo));
+	            if (r == KErrNone)
+	                {
+	                TPckgBuf<TDirCacheInfo> pkgBuf(aInfo);
+	                r = aMessage.Write(2,pkgBuf);
+	                }
+                return r;
+		        }
+		    return KErrNotSupported;
 			}
 
 
--- a/userlibandfileserver/fileserver/sfile/sf_cache_client.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_cache_client.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -635,6 +635,13 @@
 	return EFalse;
 	}
 
+// return true if more than half of the segments in this file are locked
+TBool CCacheClient::LockedSegmentsHalfUsed()
+	{
+	if (LockedBytes() > (iMaxBytesCached >> 1))
+		return ETrue;
+	return EFalse;
+	}
 
 TInt CCacheClient::CachedBytes()
 	{
--- a/userlibandfileserver/fileserver/sfile/sf_cache_client.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_cache_client.h	Tue Jul 06 15:50:07 2010 +0300
@@ -57,6 +57,7 @@
 	TBool SegmentEmpty(TInt64 aPos);
 	TBool SegmentDirty(TInt64 aPos);
 	TBool TooManyLockedSegments();
+	TBool LockedSegmentsHalfUsed();
 
 	inline TInt CacheOffset(TInt64 aLinAddr) const \
 		{return(I64LOW(aLinAddr)& ((1 << iManager.SegmentSizeLog2())-1));}
--- a/userlibandfileserver/fileserver/sfile/sf_cache_man.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_cache_man.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -177,7 +177,7 @@
 	iMaxLockedSegments = TGlobalFileCacheSettings::MaxLockedSize() >> KSegmentSizeLog2;
 
 #ifdef __SIMULATE_LOCK_FAILURES__
-	iSimulateLockFailureMode = ETrue;
+	iSimulateLockFailureMode = EFalse;	// off by default unless switched on by KControlIoSimulateLockFailureMode
 #endif
 	}
 
--- a/userlibandfileserver/fileserver/sfile/sf_debug.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_debug.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -19,8 +19,9 @@
 #include <f32dbg.h>
 #include "f32image.h"
 #include <F32plugin.h>
+#include <filesystem_fat.h>
 #include "sf_file_cache.h"
-
+#include "sf_memory_man.h"
 
 #if defined(_DEBUG) || defined(_DEBUG_RELEASE)
 
@@ -28,6 +29,29 @@
 // ONLY INCLUDED IN DEBUG BUILDS
 //
 
+void PrintOpenFiles()
+	{
+	CCacheManager* manager = CCacheManagerFactory::CacheManager();
+	TInt allocatedSegmentCount = manager ? manager->Stats().iAllocatedSegmentCount : 0;
+	TInt lockedSegmentCount = manager ? manager->Stats().iLockedSegmentCount : 0;
+	TInt fileCount = manager ? manager->Stats().iFileCount : 0;
+	TInt filesOnClosedQueue = manager ? manager->Stats().iFilesOnClosedQueue : 0;
+
+	RDebug::Print(_L("TRACE: Open files %d allocatedSegmentCount %d lockedSegmentCount %d fileCount %d filesOnClosedQueue %d\n"), 
+		Files->Count(), allocatedSegmentCount, lockedSegmentCount, fileCount, filesOnClosedQueue);
+
+	Files->Lock();
+	TInt count=Files->Count();
+
+	for (TInt n=0; n<count; n++)
+		{
+		CFileCB* file=(CFileCB*)(*Files)[n];
+
+		RDebug::Print(_L("%3d: %C:%S fc %x sz %lx\n"), n, file->Drive().DriveNumber() + 'A', &file->FileNameF(), file->FileCache(), file->CachedSize64());
+		}
+	Files->Unlock();
+	}
+
 void PrintHeapSize(const TDesC& aMessage)
 //
 // Display the total memory available
@@ -625,6 +649,101 @@
         	
         	return KErrNone;
         	}
+        case KControlIoGlobalCacheConfig:
+		// read ESTART.TXT file for global memory settings
+            {
+            TGlobalCacheConfig globalCacheConfig;
+            TInt32 rel;
+            
+            const TInt KByteToByteShift = 10;
+            _LIT8(KLitSectionNameCacheMemory,"CacheMemory");
+            
+            if (F32Properties::GetInt(KLitSectionNameCacheMemory, _L8("GlobalCacheMemorySize"), rel))
+                globalCacheConfig.iGlobalCacheSizeInBytes = rel << KByteToByteShift;
+            else
+                globalCacheConfig.iGlobalCacheSizeInBytes = KErrNotFound;
+
+            if (F32Properties::GetInt(KLitSectionNameCacheMemory, _L8("LowMemoryThreshold"), rel))
+                globalCacheConfig.iGlobalLowMemoryThreshold = rel;
+            else
+                globalCacheConfig.iGlobalLowMemoryThreshold = KErrNotFound;
+
+            TPckgBuf<TGlobalCacheConfig> pkgBuf(globalCacheConfig);
+            TInt r=aRequest->Write(2,pkgBuf);
+            return r;
+            }
+        case KControlIoGlobalCacheInfo:
+    	// get system's current global cache memory info
+            {
+            TGlobalCacheInfo info;
+            info.iGlobalCacheSizeInBytes = TGlobalCacheMemorySettings::CacheSize();
+            info.iGlobalLowMemoryThreshold = TGlobalCacheMemorySettings::LowMemoryThreshold();
+            TPckgBuf<TGlobalCacheInfo> pkgBuf(info);
+            TInt r=aRequest->Write(2,pkgBuf);
+            return r;
+            }
+         case KControlIoDirCacheConfig:
+         // read ESTART.TXT file for per-drive directory cache settings
+            {
+            TInt driveNumber = aRequest->Drive()->DriveNumber();
+            TDirCacheConfig dirCacheConfig;
+            TInt32 rel;
+            dirCacheConfig.iDrive = driveNumber;
+            TBuf8<32> driveSection;
+            driveSection.Format(_L8("Drive%c"), 'A' + driveNumber);
+            
+            if (F32Properties::GetInt(driveSection, _L8("FAT_LeafDirCacheSize"), rel))
+                dirCacheConfig.iLeafDirCacheSize = rel;
+            else
+                dirCacheConfig.iLeafDirCacheSize = KErrNotFound;
+
+            if (F32Properties::GetInt(driveSection, _L8("FAT_DirCacheSizeMin"), rel))
+                dirCacheConfig.iDirCacheSizeMin = rel << KByteToByteShift;
+            else
+                dirCacheConfig.iDirCacheSizeMin = KErrNotFound;
+
+            if (F32Properties::GetInt(driveSection, _L8("FAT_DirCacheSizeMax"), rel))
+                dirCacheConfig.iDirCacheSizeMax = rel << KByteToByteShift;
+            else
+                dirCacheConfig.iDirCacheSizeMax = KErrNotFound;
+
+            TPckgBuf<TDirCacheConfig> pkgBuf(dirCacheConfig);
+            TInt r=aRequest->Write(2,pkgBuf);
+            return r;
+            }
+         case KControlIoDirCacheInfo:
+         // get system's current per-drive directory cache settings
+		 //  currently only supports FAT file system
+             {
+             TFSName fsName;
+             aRequest->Drive()->CurrentMount().FileSystemName(fsName);
+             if (fsName.CompareF(KFileSystemName_FAT) == 0)
+                 {
+                 // 16 is the control cmd used for FAT
+                 //  see EFATDirCacheInfo in FAT code please. 
+                 const TInt KFATDirCacheInfo = 16;
+                 return(aRequest->Drive()->ControlIO(aRequest->Message(),KFATDirCacheInfo,param1,param2));
+                 }
+             return KErrNotSupported;
+             }
+         case KControlIoSimulateMemoryLow:
+             {
+             CCacheMemoryManager* cacheMemManager = CCacheMemoryManagerFactory::CacheMemoryManager();
+             if (cacheMemManager)
+                 cacheMemManager->SetMemoryLow(ETrue);
+             else
+                 return KErrNotSupported;
+             return KErrNone;
+             }
+         case KControlIoStopSimulateMemoryLow:
+             {
+             CCacheMemoryManager* cacheMemManager = CCacheMemoryManagerFactory::CacheMemoryManager();
+             if (cacheMemManager)
+                 cacheMemManager->SetMemoryLow(EFalse);
+             else
+                 return KErrNotSupported;
+             return KErrNone;
+             }
 		
 		}
 #endif
--- a/userlibandfileserver/fileserver/sfile/sf_drv.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_drv.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -85,7 +85,7 @@
 	return(KErrNone);
 	}
 
-void ValidateAtts(TUint /*anEntryAtts*/,TUint& aSetAttMask,TUint& aClearAttMask)
+void ValidateAtts(TUint& aSetAttMask,TUint& aClearAttMask)
 //
 // Do not allow the entry type to be changed
 //
@@ -1169,24 +1169,44 @@
 // Get entry details
 //
 	{
-	FlushCachedFileInfoL();
 	OstTrace1(TRACE_FILESYSTEM, FSYS_ECMOUNTCBENTRYL, "drive %d", DriveNumber());
 	OstTraceData(TRACE_FILESYSTEM, FSYS_ECMOUNTCBENTRYL_EFILEPATH, "FilePath %S", aName.Ptr(), aName.Length()<<1);
 	CurrentMount().EntryL(aName,anEntry);
+
+	// If the file is already open then read the file attributes directly from the file
+	TFileName foldedName;
+	TUint32 nameHash=0;
+	foldedName.CopyF(aName);
+	nameHash=CalcNameHash(foldedName);
+
+	__CHECK_DRIVETHREAD(iDriveNumber);
+	TDblQueIter<CFileCB> q(CurrentMount().iMountQ);
+	CMountCB* currentMount = &CurrentMount();
+	CFileCB* file;
+	while ((file=q++)!=NULL)
+		{
+		if ((&file->Drive()==this) && 
+			&file->Mount() == currentMount &&
+			nameHash == file->NameHash() && 
+			file->FileNameF().Match(foldedName)==KErrNone)
+			{
+			anEntry.iAtt = file->Att() & ~KEntryAttModified;
+			anEntry.SetFileSize(file->CachedSize64());
+			anEntry.iModified = file->Modified();
+			break;
+			}
+		}
+
+
 	OstTraceExt5(TRACE_FILESYSTEM, FSYS_ECMOUNTCBENTRYLRET, "att %x modified %x:%x  size %x:%x", (TUint) anEntry.iAtt, (TUint) I64HIGH(anEntry.iModified.Int64()), (TUint) I64LOW(anEntry.iModified.Int64()), (TUint) I64HIGH(anEntry.FileSize()), (TUint) anEntry.FileSize());
 	}
 
-TInt TDrive::CheckAttributes(const TDesC& aName,TUint& aSetAttMask,TUint& aClearAttMask)
+TInt TDrive::CheckAttributes(TUint& aSetAttMask,TUint& aClearAttMask)
 //
 // Validate the changes against the current entry attributes
 //
 	{
-
-	TEntry entry;
-	TRAPD(r,DoEntryL(aName,entry));
-	if (r!=KErrNone)
-		return(r);
-	ValidateAtts(entry.iAtt,aSetAttMask,aClearAttMask);
+	ValidateAtts(aSetAttMask,aClearAttMask);
 	return(KErrNone);
 	}
 
@@ -1203,7 +1223,7 @@
 	CFileCB* pF=LocateFile(entryName);
 	if (pF!=NULL)
 		return(KErrInUse);
-	r=CheckAttributes(entryName,aSetAttMask,aClearAttMask);
+	r=CheckAttributes(aSetAttMask,aClearAttMask);
 	if (r!=KErrNone)
 		return(r);
 	if (IsWriteProtected())
--- a/userlibandfileserver/fileserver/sfile/sf_ext.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_ext.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -52,7 +52,7 @@
 */
 CProxyDrive::~CProxyDrive()
 	{
-	
+	delete iBody;
 	}
 
 
@@ -175,6 +175,32 @@
 	}	
 
 
+TInt CProxyDrive::SetAndOpenLibrary(RLibrary aLibrary)
+	{
+	TInt r = KErrNone;
+	if (iBody)
+		{
+		iBody->iLibrary = aLibrary;
+		r = iBody->iLibrary.Duplicate(RThread(), EOwnerProcess);
+		}
+	return r;
+	}
+
+/**
+Gets a copy of the Proxy Drive library (previously opened by OpenLibrary()) prior to deleting the proxy drive itself.
+After deleting the proxy drive, RLibrary::Close() should be called on the returned RLibrary object.
+*/
+RLibrary CProxyDrive::GetLibrary()
+	{
+	RLibrary lib;
+	if (iBody)
+		{
+		lib = iBody->iLibrary;
+		iBody->iLibrary.SetHandle(NULL);
+		}
+	return lib;
+	}
+
 /**
 Constructor.
 */
@@ -189,8 +215,12 @@
 EXPORT_C CLocDrvMountCB::~CLocDrvMountCB()
 	{
 	__PRINT1(_L("CLocDrvMountCB::~CLocDrvMountCB() 0x%x"),this);
-	if(iProxyDrive && !LocalDrives::IsProxyDrive(Drive().DriveNumber()) && LocalDrives::IsValidDriveMapping(Drive().DriveNumber()))
-		delete(iProxyDrive);
+	if(iProxyDrive && !LocalDrives::IsProxyDrive(Drive().DriveNumber()))
+		{
+		RLibrary lib = iProxyDrive->GetLibrary();
+		delete iProxyDrive;
+		lib.Close();
+		}
 	}
 
 
@@ -282,7 +312,6 @@
 	{
 	__ASSERT_ALWAYS(iProxyDrive!=NULL,Fault(ELocDrvDismountedLocalDrive));
 	iProxyDrive->Dismounted();
-	iProxyDrive->SetMount(NULL);
 	}
 
 
--- a/userlibandfileserver/fileserver/sfile/sf_file.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_file.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -1026,9 +1026,6 @@
 			{
 			file->SetNotifyAsyncReadersPending(ETrue);
 			}
-		
-        file->iAtt |= KEntryAttModified;
-
 		}
 	else if (aRetVal == KErrCorrupt)
 		file->SetFileCorrupt(ETrue);
@@ -1686,7 +1683,7 @@
 	
     TUint setAttMask=(TUint)(aRequest->Message().Int0());
 	TUint clearAttMask=(TUint)aRequest->Message().Int1();
-	ValidateAtts(share->File().Att(),setAttMask,clearAttMask);
+	ValidateAtts(setAttMask,clearAttMask);
 	OstTraceExt3(TRACE_FILESYSTEM, FSYS_ECFILECBSETENTRYL1, "this %x aSetAttMask %x aClearAttMask %x", (TUint) &share->File(), (TUint) setAttMask, (TUint) clearAttMask);
 	TRAP(r,share->File().SetEntryL(TTime(0),setAttMask,clearAttMask))
 	OstTrace1(TRACE_FILESYSTEM, FSYS_ECFILECBSETENTRYL1RET, "r %d", r);
@@ -1796,7 +1793,7 @@
 	aRequest->ReadL(KMsgPtr0,t);
 	TUint setAttMask=(TUint)(aRequest->Message().Int1()|KEntryAttModified);
 	TUint clearAttMask=(TUint)aRequest->Message().Int2();
-	ValidateAtts(share->File().Att(),setAttMask,clearAttMask);//	Validate attributes
+	ValidateAtts(setAttMask,clearAttMask);//	Validate attributes
 
 	OstTraceExt3(TRACE_FILESYSTEM, FSYS_ECFILECBSETENTRYL3, "this %x aSetAttMask %x aClearAttMask %x", (TUint) &share->File(), (TUint) setAttMask, (TUint) clearAttMask);
 	TRAP(r,share->File().SetEntryL(time,setAttMask,clearAttMask))
@@ -3444,20 +3441,12 @@
 the file size shall be modified after acquiring the iLock mutex and if it is ETrue, 
 the file size shall be modified without aquiring the iLock mutex.  
 */
-EXPORT_C void CFileCB::SetSize64(TInt64 aSize, TBool aDriveLocked)
+EXPORT_C void CFileCB::SetSize64(TInt64 aSize, TBool /*aDriveLocked*/)
 	{
-	if(aDriveLocked)
-		{
-		iSize = (TInt)I64LOW(aSize);
-		iBody->iSizeHigh = (TInt)I64HIGH(aSize);
-		}
-	else
-		{
-		Drive().Lock();
-		iSize = (TInt)I64LOW(aSize);
-		iBody->iSizeHigh = (TInt)I64HIGH(aSize);
-		Drive().UnLock();
-		}
+	// cuurently this should only be called from the drive thread
+	ASSERT(FsThreadManager::IsDriveThread(Drive().DriveNumber(),EFalse));
+	iSize = (TInt)I64LOW(aSize);
+	iBody->iSizeHigh = (TInt)I64HIGH(aSize);
 	}
 
 
--- a/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -40,6 +40,9 @@
 // disables flushing of stale cachelines before each write
 #define LAZY_WRITE
 
+// call SetSizeL() to pre-allocate FAT clusters before flushing dirty data
+#define SETSIZE_BEFORE_WRITE	
+
 enum TFileCacheFault
 	{
 	ECacheSettingsInitFailed,
@@ -67,6 +70,7 @@
 	EUnexpectedReNewLFailure,
 	EDirtyDataOwnerNull,
 	EFlushingWithSessionNull,
+	EFlushingWithAllocatedRequest,
 	};
 
 
@@ -80,6 +84,10 @@
 
 const TInt KMinSequentialReadsBeforeReadAhead = 3;
 
+#ifdef DOUBLE_BUFFERED_WRITING
+const TInt KMinSequentialAppendsBeforeFlush = 3;
+#endif
+
 //************************************
 // CFileCache
 //************************************
@@ -989,7 +997,7 @@
 				// with any dirty data already in the file cache
 				if (aMode & EFileWriteBuffered)
 					{
-					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, ETrue);
+					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFlushAll);
 					if (r == CFsRequest::EReqActionBusy || r != CFsRequest::EReqActionComplete)
 						return r;
 					}
@@ -1163,13 +1171,25 @@
 					currentPos = iSize64;
 				iInitialSize = iSize64;
 
+
+#ifdef DOUBLE_BUFFERED_WRITING
+				// count the number of sequential write-appends
+				if (currentOperation->iClientRequest)
+					{
+					if (currentPos == iSize64)
+						iSequentialAppends++;
+					else
+						iSequentialAppends = 0;
+					}
+#endif // DOUBLE_BUFFERED_WRITING
+
 				// if EFileWriteDirectIO OR 
 				// (caching writes and requested write len > size of the cache), 
 				// flush the write cache
 				if ((aMode & EFileWriteBuffered) == 0 || 
 					(cachingWrites && totalLen > iCacheSize))
 					{
-					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, ETrue);
+					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFlushAll);
 					if (r == CFsRequest::EReqActionBusy || r != CFsRequest::EReqActionComplete)
 						return r;
 					}
@@ -1241,7 +1261,7 @@
 					// If there's nothing to flush then the dirty (locked) data
 					// must belong to another drive, so there's not much we can do
 					// but write through 
-					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFalse);
+					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFlushSingle);
 					if (r == CFsRequest::EReqActionBusy)
 						return CFsRequest::EReqActionBusy;
 					if (r != KErrInUse)
@@ -1266,11 +1286,18 @@
 					// or wait if already flushing
 					if (iFlushBusy)
 						return CFsRequest::EReqActionBusy;
-					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFalse);
+					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFlushSingle);
 					if (r != CFsRequest::EReqActionBusy && r != CFsRequest::EReqActionComplete)
 						lastError = r;
 					}
 #endif
+#ifdef DOUBLE_BUFFERED_WRITING
+				if (cachingWrites && lastError == KErrNone && 
+					iSequentialAppends >= KMinSequentialAppendsBeforeFlush && iCacheClient->LockedSegmentsHalfUsed())
+					{
+					DoFlushDirty(aNewRequest, &aMsgRequest, EFlushHalf);
+					}
+#endif
 				// if no cacheline found & write caching is enabled, allocate a new cacheline
 				if (cachingWrites && addr == NULL && lastError == KErrNone)
 					{
@@ -1499,7 +1526,7 @@
 
 				if (cachingWrites)
 					{
-					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, ETrue);
+					TInt r = DoFlushDirty(aNewRequest, &aMsgRequest, EFlushAll);
 #ifdef _DEBUG
 					if (r == CFsRequest::EReqActionBusy)
 						CCacheManagerFactory::CacheManager()->Stats().iWriteThroughWithDirtyDataCount++;
@@ -1577,7 +1604,7 @@
 
 	CFsClientMessageRequest* newRequest = NULL;
 
-	TInt r = DoFlushDirty(newRequest, aOldRequest, ETrue);
+	TInt r = DoFlushDirty(newRequest, aOldRequest, EFlushAll);
 
 	iLock.Signal();
 
@@ -1615,7 +1642,7 @@
 /**
 CFileCache::DoFlushDirty()
 
-@param aFlushAll. If EFalse then only a single cacheline will be flushed
+@param aFlushMode. The flush mode which indicates how many cache-lines to flush. @See TFlushMode
 
 returns	CFsRequest::EReqActionBusy if a flush is in progress OR cacheline already in use
 		CFsRequest::EReqActionComplete if nothing to flush / flush completed 
@@ -1623,11 +1650,13 @@
 		or one of the system wide error codes
 
  */
-TInt CFileCache::DoFlushDirty(CFsClientMessageRequest*& aNewRequest, CFsRequest* aOldRequest, TBool aFlushAll)
+TInt CFileCache::DoFlushDirty(CFsClientMessageRequest*& aNewRequest, CFsRequest* aOldRequest, TFlushMode aFlushMode)
 	{
 	TInt64  pos;
 	TUint8* addr;
 
+	__ASSERT_ALWAYS(aNewRequest == NULL, Fault(EFlushingWithAllocatedRequest));
+
 	if (iFlushBusy)
 		return CFsRequest::EReqActionBusy;
 
@@ -1681,10 +1710,8 @@
 		return r;
 		}
 
-	// set the number of segments to flush - either all dirty data or the equivalent of one full cacheline
-	aNewRequest->CurrentOperation().iScratchValue0 = 
-		(TAny*) (aFlushAll?KMaxTInt:iCacheClient->CacheLineSizeInSegments());
-
+	// set the flush mode
+	aNewRequest->CurrentOperation().iScratchValue0 = (TAny*) aFlushMode;
 
 	// issue flush request
 	r = FlushDirtySm(*aNewRequest);
@@ -1701,6 +1728,11 @@
 		}
 	else	// CFsRequest::EReqActionComplete
 		{
+		// Return any allocation failures etc to client
+		TInt lastError = aNewRequest->LastError();
+		if (lastError != KErrNone)
+			r = lastError;
+
 		aNewRequest->PopOperation();
 		aNewRequest->Free();
 		aNewRequest = NULL;
@@ -1778,9 +1810,6 @@
 				TUint8* addr;
 				TInt segmentCount = iCacheClient->FindFirstDirtySegment(pos, addr);
 				
-				// keep track of how many segments we've written
-				currentOperation->iScratchValue0 = (TAny*) ((TInt) currentOperation->iScratchValue0 - segmentCount);
-
 				// if no more dirty segments of if a genuine error then finish
 				// NB if the request has been cancelled then we still need to proceed and mark all the
 				// segments as clean, otherwise they will never get freed !
@@ -1807,6 +1836,28 @@
 					break;
 					}
 
+#ifdef SETSIZE_BEFORE_WRITE	
+				TInt64 physicalFileSize = iFileCB->Size64();
+				if ((pos + (TInt64) len) > physicalFileSize)
+					{
+					// Need to switch to drive thread before calling CFileCB::SetSizeL()
+					if (!IsDriveThread())
+						{
+						aMsgRequest.SetState(CFsRequest::EReqStatePostInitialise);
+						return CFsRequest::EReqActionBusy;
+						}
+					__CACHE_PRINT2(_L("CACHEFILE: Increasing uncached size from %ld to %ld"), iFileCB->Size64(), iSize64);
+					TInt r;
+
+					r = CheckDiskSpace(iSize64 - physicalFileSize, &aMsgRequest);
+			        if(r == KErrNone)
+						TRAP(r, iFileCB->SetSizeL(iSize64))
+					if (r == KErrNone)
+						{
+ 						iFileCB->SetSize64(iSize64, ETrue);	// NB drive might be locked
+						}
+					}
+#endif
 				__CACHE_PRINT3(_L("CACHEFILE: FlushDirty first dirty pos %d, addr %08X count %d"), I64LOW(pos), addr, segmentCount);
 
 				TInt filledSegmentCount;
@@ -1900,12 +1951,24 @@
 					}
 
 
-				if (TInt(currentOperation->iScratchValue0) > 0)
-					currentOperation->iState = EStWriteToDisk;
-				else
-					currentOperation->iState = EStEnd;
-
-
+				switch((TFlushMode) (TInt) currentOperation->iScratchValue0)
+					{
+					case EFlushSingle:
+						currentOperation->iState = EStEnd;
+						break;
+					case EFlushHalf:
+						if (iCacheClient->LockedSegmentsHalfUsed())
+							currentOperation->iState = EStWriteToDisk;
+						else
+							currentOperation->iState = EStEnd;
+						break;
+					case EFlushAll:
+						currentOperation->iState = EStWriteToDisk;
+						break;
+					default:
+						ASSERT(0);
+						break;
+					}
 				}
 				break;
 
--- a/userlibandfileserver/fileserver/sfile/sf_file_cache.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.h	Tue Jul 06 15:50:07 2010 +0300
@@ -28,6 +28,9 @@
 
 //#define _DEBUG_READ_AHEAD
 
+// if writing sequentially, start flushing dirty data when the cache is half full
+//#define DOUBLE_BUFFERED_WRITING
+
 
 NONSHARABLE_CLASS(CFileCache) : public CFsDispatchObject
 	{
@@ -75,7 +78,8 @@
 
 	TInt DoReadBuffered(CFsMessageRequest& aMsgRequest, TUint aMode, CFsClientMessageRequest*& aNewRequest);
 	TInt DoWriteBuffered(CFsMessageRequest& aMsgRequest, CFsClientMessageRequest*& aNewRequest, TUint aMode);
-	TInt DoFlushDirty(CFsClientMessageRequest*& aNewRequest, CFsRequest* aOldRequest, TBool aFlushAll);
+	enum TFlushMode {EFlushSingle, EFlushHalf, EFlushAll};
+	TInt DoFlushDirty(CFsClientMessageRequest*& aNewRequest, CFsRequest* aOldRequest, TFlushMode aFlushMode);
 
 
 	inline TInt SegmentSize() const;
@@ -156,6 +160,11 @@
 	TBool iFileCacheReadAsync;
 	CFsClientMessageRequest* iReadAheadRequest;
 
+#ifdef DOUBLE_BUFFERED_WRITING
+	// sequential append-write detection
+	TInt iSequentialAppends;
+#endif
+
 	friend class TClosedFileUtils;
 	friend class TFsFileWriteDirty;
 	};
--- a/userlibandfileserver/fileserver/sfile/sf_local.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_local.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -320,8 +320,31 @@
 	// Create the actual proxy drive...
 	CProxyDrive* pD = NULL;
 	TInt r = pF->CreateProxyDrive(pD, NULL);
-	__ASSERT_ALWAYS(r == KErrNone, User::Panic(_L("CreateProxyDrive Error"), r));
-	__ASSERT_ALWAYS(pD != NULL, User::Panic(_L("CreateProxyDrive returned NULL"), -999));
+	if (r != KErrNone)
+		{
+		delete pD;
+		return r;
+		}
+	if (pD == NULL)
+		return KErrNoMemory;
+
+	// Create the proxy drive body... which is used to store the library handle
+	CProxyDriveBody* pBody = new CProxyDriveBody();
+	if (pBody == NULL)
+		{
+		delete pD;
+		return KErrNoMemory;
+		}
+	pD->iBody = pBody;
+
+	// Re-open the library so that it is safe to call RFs::RemoveProxyDrive() before the proxy drive has been deleted -
+	// which can happen if the file system is dismounted with open file handles
+	r = pD->SetAndOpenLibrary(pF->Library());
+	if (r != KErrNone)
+		{
+		delete pD;
+		return r;
+		}
 
 	iMapping[drive] = i+KMaxLocalDrives;
 
@@ -386,7 +409,12 @@
 	__ASSERT_ALWAYS(aDrive>=0 && aDrive<KMaxDrives,Fault(EClearProxyDriveMapping1));
 	__ASSERT_DEBUG(iMapping[aDrive]>= KMaxLocalDrives && iProxyDriveMapping[iMapping[aDrive]-KMaxLocalDrives],Fault(EClearProxyDriveMapping2));
 	TInt idx = iMapping[aDrive]-KMaxLocalDrives;
-	delete iProxyDriveMapping[idx];
+	if (iProxyDriveMapping[idx]->Mount() == NULL)	// don't delete if it's still owned by its mount
+		{
+		RLibrary lib = iProxyDriveMapping[idx]->GetLibrary();
+		delete iProxyDriveMapping[idx];
+		lib.Close();
+		}
 	iProxyDriveMapping[idx] = NULL;
 	iMapping[aDrive] = KDriveInvalid;
 	}
--- a/userlibandfileserver/fileserver/sfile/sf_memory_client.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_memory_client.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -170,7 +170,8 @@
        	return addr;
        	}
     
-	// if we have used up reserved region, get new pages from reusable pool first
+    TBool touchedMore = EFalse;
+	// if we have touched beyond reserved region, get new pages from reusable pool first
     if (iReusablePagePool.Count())
     	{
 		addr = iReusablePagePool[0];
@@ -181,7 +182,7 @@
     else
     	{
     	addr = iBase + (iTouchedRegionFlag << iSegSizeInBytesLog2);
-    	iTouchedRegionFlag += aSegmentCount;
+    	touchedMore = ETrue;
 //       	__PRINT2(_L("!! GROW TOUCHED SEGS: addr=0x%x, touched=%d"), addr, iTouchedRegionFlag);
     	}
 	
@@ -197,6 +198,10 @@
 	if (r != KErrNone)
 		return NULL;
 
+	if (touchedMore)
+	    {
+	    iTouchedRegionFlag += aSegmentCount;
+	    }
 	return addr;
 	}
 
--- a/userlibandfileserver/fileserver/sfile/sf_memory_man.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_memory_man.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -81,7 +81,7 @@
 	TInt r = UserHal::MemoryInfo(meminfo);
 	ASSERT(r==KErrNone);
 	User::LeaveIfError(r);
-	iLowMemoryThreshold = (meminfo().iTotalRamInBytes * TGlobalCacheMemorySettings::LowMemoryThreshold()) / 100;
+	iLowMemoryThreshold = (TInt) (meminfo().iTotalRamInBytes * (TGlobalCacheMemorySettings::LowMemoryThreshold() / 100.00));
 	TChunkCreateInfo createInfo;
 	createInfo.SetCache(iSizeInBytes);
 	createInfo.SetOwner(EOwnerProcess);
@@ -287,6 +287,10 @@
 */
 void CCacheMemoryManagerFactory::CreateL()
 	{
+	// Panic in DEBUG mode when GlobalCacheMemorySize is set as a negative value.  
+	ASSERT(TGlobalCacheMemorySettings::CacheSize() >= 0);
+	ASSERT(TGlobalCacheMemorySettings::LowMemoryThreshold() >= 0);
+	
 	if (TGlobalCacheMemorySettings::CacheSize() > 0)
 	    iCacheMemoryManager = CCacheMemoryManager::NewL(TGlobalCacheMemorySettings::CacheSize());
 	else
@@ -337,12 +341,12 @@
 		iLowMemoryThreshold = lowMemoryThreshold;
 	}
 
-TInt TGlobalCacheMemorySettings::CacheSize()
+TInt32 TGlobalCacheMemorySettings::CacheSize()
 	{
 	return iCacheSizeInBytes;
 	}
 
-TInt TGlobalCacheMemorySettings::LowMemoryThreshold()
+TInt32 TGlobalCacheMemorySettings::LowMemoryThreshold()
 	{
 	return iLowMemoryThreshold;
 	}
--- a/userlibandfileserver/fileserver/sfile/sf_memory_man.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_memory_man.h	Tue Jul 06 15:50:07 2010 +0300
@@ -47,6 +47,10 @@
 	TUint8* Base();
 	void 	FreeMemoryChanged(TBool aIsMemoryLow);
 
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+	void    SetMemoryLow(TBool aSetMemoryLow) {isMemoryLow = aSetMemoryLow;}; 
+#endif //defined(_DEBUG) || defined(_DEBUG_RELEASE)
+
 private:
 	~CCacheMemoryManager();
 	CCacheMemoryManager(TUint32 aMaxSize);
@@ -91,8 +95,8 @@
 public:
 	static void ReadPropertiesFile();
 
-	static TInt CacheSize();
-	static TInt LowMemoryThreshold();
+	static TInt32 CacheSize();
+	static TInt32 LowMemoryThreshold();
 private:
 	static TInt32 iCacheSizeInBytes;
 	static TInt32 iLowMemoryThreshold;
--- a/userlibandfileserver/fileserver/sfile/sf_nbs.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_nbs.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -226,12 +226,6 @@
 	if (r!=KErrNone)
 		return(r);
 
-	// If the file is open, get the file size from the CFileCB object as there may be cached data
-	CFileCB* file;
-	aRequest->Drive()->IsFileOpen(filePath, file);
-	if (file)
-		t.SetFileSize(file->CachedSize64());
-
 	TPckgC<TEntry> p(t);
 	aRequest->WriteL(KMsgPtr1,p);
 	return(KErrNone);
--- a/userlibandfileserver/fileserver/sfile/sf_prel.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_prel.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -242,10 +242,15 @@
 void CreateCorruptFileNamesList()
 	{
 	RFs fs;
-	fs.Connect();
-	TInt r=FindHitListFile(fs);
+	
+    TInt r = fs.Connect();
 	if(r!=KErrNone)
 		return;
+	
+    r=FindHitListFile(fs);
+	if(r!=KErrNone)
+		return;
+	
 	RFile f;
 	r=f.Open(fs,*gCorruptFileNamesListFile,EFileShareExclusive|EFileStreamText|EFileRead);
 	if(r!=KErrNone)
--- a/userlibandfileserver/fileserver/sfile/sf_std.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_std.h	Tue Jul 06 15:50:07 2010 +0300
@@ -1752,7 +1752,7 @@
 
  TInt  ValidateDrive(TInt aDriveNumber,CFsRequest* aRequest);
  TInt  ValidateDriveDoSubst(TInt aDriveNumber,CFsRequest* aRequest);
- void  ValidateAtts(TUint anEntryAtt,TUint& aSetAttMask,TUint& aClearAttMask);
+ void  ValidateAtts(TUint& aSetAttMask,TUint& aClearAttMask);
  TInt  ParseSubstPtr0(CFsRequest* aRequest,TParse& aParse, TBool aUseSessionPath = ETrue);
  TInt  ParseNoWildSubstPtr0(CFsRequest* aRequest,TParse& aParse, TBool aUseSessionPath = ETrue);
  TInt  ParseNoWildSubstPtr1(CFsRequest* aRequest,TParse& aParse);
@@ -1953,6 +1953,12 @@
 friend class CMountCB;
 	};
 
+// extension to CProxyDrive
+class CProxyDriveBody : public CBase
+	{
+public:
+	RLibrary iLibrary;
+	};
 
 #include "sf_ops.h"
 #include "sf_std.inl"
--- a/userlibandfileserver/fileserver/sfile/sf_thread.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfile/sf_thread.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -834,10 +834,9 @@
 //
 	{
 	__ASSERT_ALWAYS(FsThreadManager::IsDriveThread(iDriveNumber,EFalse),Fault(EDriveThreadNotifyUser1));
-	// NB For read-ahead or a flush-dirty write request generated by the file cache, the session will be NULL: 
+	// NB For read-ahead or a flush-dirty write request generated by the file cache, the request or the session may be NULL: 
 	// in this case assume that notify user is set (as it's the safest option)
-	CSessionFs* session = iRequest->Session();
-	return session ?  session->GetNotifyUser() : ETrue;
+	return iRequest && iRequest->Session() ?  iRequest->Session()->GetNotifyUser() : ETrue;
 	}
 
 void CDriveThread::StartFinalisationTimer()
--- a/userlibandfileserver/fileserver/sfsrv/cl_scan.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/sfsrv/cl_scan.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -410,6 +410,10 @@
 	CDir* dirEntries = NULL;
 	TInt r;
 	aDirEntries=NULL;
+	
+	if(iStack && iStack->IsEmpty())
+	    return;
+	
 	CDirList* list=iStack->Peek();
 	while (!list->MoreEntries())
 		{
--- a/userlibandfileserver/fileserver/shostmassstorage/server/controller/cusbhostmsdevicethread.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/shostmassstorage/server/controller/cusbhostmsdevicethread.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -308,6 +308,9 @@
             }
 		return;
 	case EUsbHostMsUnRegisterInterface:
+		// Check whether all luns have got uninitialised. 
+		for(TInt i = 0, j = iUsbHostMsDevice->GetMaxLun(); i <= j; i++)
+			TRAP_IGNORE(iUsbHostMsDevice->RemoveLunL(i));
 		TRAP(ret, UnRegisterInterfaceL(aMessage));
 		break;
 	case EUsbHostMsRegisterLun:
--- a/userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/shostmassstorage/server/src/cusbhostmssession.cpp	Tue Jul 06 15:50:07 2010 +0300
@@ -114,9 +114,13 @@
 			return;
 			}
 		break;
+	case EUsbHostMsUnRegisterInterface:
+		iCleanupInProgress = ETrue;
+		break;
 	/* If it is a cleanup then we need to delete the iDeviceThread */
 	case EUsbHostMsFinalCleanup:	
 		delete iDeviceThread;
+		iDeviceThread = NULL;
 		iThread.Kill(KErrNone);
 		aMessage.Complete(KErrNone);
 		return;
@@ -124,7 +128,12 @@
 		break;
 		}
 
-	__ASSERT_DEBUG(iDeviceThread != NULL, User::Panic(KUsbMsHostPanicCat, EDeviceThreadDoesNotExist));
+	if (iDeviceThread == NULL || iCleanupInProgress ) 
+		{
+		aMessage.Complete(KErrBadHandle);
+		return;
+		}
+
 
 	r = iDeviceThread->QueueMsg(aMessage);
 	if (r != KErrNone)
--- a/userlibandfileserver/fileserver/shostmassstorage/server/src/include/cusbhostmssession.h	Wed Jun 23 19:44:53 2010 +0300
+++ b/userlibandfileserver/fileserver/shostmassstorage/server/src/include/cusbhostmssession.h	Tue Jul 06 15:50:07 2010 +0300
@@ -63,6 +63,7 @@
 	CUsbHostMsDeviceThread* iDeviceThread;
 	RThread	iThread;
 
+	TBool iCleanupInProgress;
     TRequestStatus* iClientStatus;
 	};