startupservices/startupanimation/tsrc/TSanimmif/src/TSanimmifBlocks.cpp
changeset 77 b01c07dfcf84
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/startupservices/startupanimation/tsrc/TSanimmif/src/TSanimmifBlocks.cpp	Thu Oct 07 06:25:45 2010 +0300
@@ -0,0 +1,659 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: This file contains testclass implementation.
+*
+*/
+
+// [INCLUDE FILES] - do not remove
+#include <e32svr.h>
+#include <StifParser.h>
+#include <StifTestInterface.h>
+#include "TSanimmif.h"
+
+#include "sanimimageplugin.h"
+
+#include "testwaiter.h"
+
+#include <ecom/ecom.h>
+
+#pragma tagging OFF // To disable CodeTest tagging
+
+const TInt KSAnimMifPluginImplUid = 0x2000B11E;
+
+_LIT( KUnknownFile, "C:\\temp\\unknown.mif" );
+_LIT( KCorruptFile, "C:\\temp\\corrupt.mif" );
+_LIT( KStillImageFile, "C:\\temp\\testimg_1.mif" );
+_LIT( KScaledAnimationFile, "C:\\temp\\testanim_1.mif" );
+_LIT( KUnscaledAnimationFile, "C:\\temp\\testanim_2.mif" );
+_LIT( KStillImageNoMaskFile, "C:\\temp\\testimg_2.mif" );
+_LIT( KNoFramesFile, "C:\\temp\\testimg_3.mif" );
+
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+//          ?value_n: ?description_line1
+//                    ?description_line2
+// -----------------------------------------------------------------------------
+//
+/*
+?type ?function_name(
+    ?arg_type arg,  // ?description
+    ?arg_type arg)  // ?description
+    {
+
+    ?code  // ?comment
+
+    // ?comment
+    ?code
+    }
+*/
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CTSanimmif::Delete
+// Delete here all resources allocated and opened from test methods. 
+// Called from destructor. 
+// -----------------------------------------------------------------------------
+//
+void CTSanimmif::Delete() 
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// CTSanimmif::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt CTSanimmif::RunMethodL( 
+    CStifItemParser& aItem ) 
+    {
+
+    static TStifFunctionInfo const KFunctions[] =
+        {  
+        // Copy this line for every implemented function.
+        // First string is the function name used in TestScripter script file.
+        // Second is the actual implementation member function. 
+        ENTRY( "Example", CTSanimmif::ExampleL ),
+        ENTRY( "SetupEmpty", CTSanimmif::SetupEmptyL ),
+        ENTRY( "SetupObj", CTSanimmif::SetupObjL ),
+        ENTRY( "SetupFile", CTSanimmif::SetupFileL ),        
+        ENTRY( "SetupStillImageNoMask", CTSanimmif::SetupStillImageNoMaskL ),
+        ENTRY( "SetupStillImage", CTSanimmif::SetupStillImageL ),
+        ENTRY( "SetupScaledAnimation", CTSanimmif::SetupScaledAnimationL ),
+        ENTRY( "SetupUnscaledAnimation", CTSanimmif::SetupUnscaledAnimationL ),
+        ENTRY( "SetupFinished", CTSanimmif::SetupFinishedL ),
+        ENTRY( "Teardown", CTSanimmif::Teardown ),        
+        ENTRY( "TestConstructor", CTSanimmif::TestConstructorL ),
+        ENTRY( "TestConstructorNoMemory", CTSanimmif::TestConstructorNoMemoryL ),
+        ENTRY( "TestUnknownFile", CTSanimmif::TestUnknownFileL ),
+        ENTRY( "TestCorruptFile", CTSanimmif::TestCorruptFileL ),
+        ENTRY( "TestNoFramesFile", CTSanimmif::TestNoFramesFileL ),
+        ENTRY( "TestLoadStillImage", CTSanimmif::TestLoadStillImageL ),             
+        ENTRY( "TestLoadScaledAnimation", CTSanimmif::TestLoadScaledAnimationL ),
+        ENTRY( "TestLoadUnscaledAnimation", CTSanimmif::TestLoadUnscaledAnimationL ),
+        ENTRY( "TestLoadNoMemory", CTSanimmif::TestLoadNoMemoryL ),
+        ENTRY( "TestCancelLoad", CTSanimmif::TestCancelLoadL ),
+        ENTRY( "TestShowStillImage", CTSanimmif::TestShowStillImageL ),
+        ENTRY( "TestShowAnimation", CTSanimmif::TestShowAnimationL ),        
+        ENTRY( "TestCancelStillImage", CTSanimmif::TestCancelStillImageL ),
+        ENTRY( "TestCancelAnimation", CTSanimmif::TestCancelAnimationL ),
+        ENTRY( "TestCancelNotActive", CTSanimmif::TestCancelNotActiveL ),
+        ENTRY( "TestShowBeforeLoad", CTSanimmif::TestShowBeforeLoadL ),
+        ENTRY( "TestSetDisplayMode", CTSanimmif::TestSetDisplayModeL ),
+        ENTRY( "TestSetSize", CTSanimmif::TestSetSizeL ),        
+        ENTRY( "TestSetFrameDelay", CTSanimmif::TestSetFrameDelayL ),
+        ENTRY( "TestBackroundColour", CTSanimmif::TestBackroundColourL ),       
+     
+         //ADD NEW ENTRY HERE
+        // [test cases entries] - Do not remove
+
+        };
+
+    const TInt count = sizeof( KFunctions ) / 
+                        sizeof( TStifFunctionInfo );
+
+    return RunInternalL( KFunctions, count, aItem );
+
+    }
+    
+    // ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// TMockMifAnimationObserver::UpdateScreen
+//
+// ---------------------------------------------------------------------------
+//
+void TMockMifAnimationObserver::UpdateScreen( const CFbsBitmap& /*aFrame*/, const CFbsBitmap& /*aMask*/ )
+    {
+    RDebug::Print( _L( "TMockMifAnimationObserver::UpdateScreen" ) );
+
+    iTestSuite.iFrameCounter++;
+    }
+
+
+// ---------------------------------------------------------------------------
+// TMockMifAnimationObserver::UpdateScreen
+//
+// ---------------------------------------------------------------------------
+//
+void TMockMifAnimationObserver::UpdateScreen( const CFbsBitmap& /*aFrame*/ )
+    {
+    iTestSuite.iFrameCounter++;
+    }
+
+
+
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::SetupEmptyL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupEmptyL()
+    {
+    iTestObj = NULL;
+    iDtorKey = TUid::Uid( 0 );
+    User::LeaveIfError( iFs.Connect() );
+    User::LeaveIfError( iFs.ShareProtected() );
+    iWaiter = CTestWaiter::NewL();
+    iFrameCounter = 0;
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::SetupObjL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupObjL()
+    {
+    SetupEmptyL();
+    iTestObj = static_cast<CSAnimImagePlugin*>(
+        REComSession::CreateImplementationL(
+            TUid::Uid( KSAnimMifPluginImplUid ), iDtorKey, &iObserver ) );
+    iTestObj->SetSize( TSize( 128, 128 ) );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::SetupFileL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupFileL( const TDesC& aFileName )
+    {
+    SetupObjL();
+    iTestObj->Load( iFs, aFileName, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::SetupStillImageNoMaskL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupStillImageNoMaskL()
+    {
+    SetupFileL( KStillImageNoMaskFile );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::SetupStillImageL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupStillImageL()
+    {
+    SetupFileL( KStillImageFile );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::SetupScaledAnimationL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupScaledAnimationL()
+    {
+    SetupFileL( KScaledAnimationFile );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::SetupUnscaledAnimationL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupUnscaledAnimationL()
+    {
+    SetupFileL( KUnscaledAnimationFile );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::SetupFinishedL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::SetupFinishedL()
+    {
+    SetupUnscaledAnimationL();
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::Teardown
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::Teardown()
+    {
+    delete iTestObj;
+    iTestObj = NULL;
+
+    REComSession::DestroyedImplementation( iDtorKey );
+
+    delete iWaiter;
+    iWaiter = NULL;
+
+    iFs.Close();
+
+    REComSession::FinalClose();
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestConstructorL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestConstructorL()
+    {
+    TAny* ptr = NULL;
+    ptr = REComSession::CreateImplementationL(TUid::Uid( KSAnimMifPluginImplUid ), iDtorKey, &iObserver );
+
+    iTestObj = static_cast<CSAnimImagePlugin*>( ptr );
+  //  EUNIT_ASSERT( iTestObj );
+    delete iTestObj;
+    iTestObj = NULL;
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestConstructorNoMemoryL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestConstructorNoMemoryL()
+    {
+    TAny* ptr = NULL;
+    ptr = REComSession::CreateImplementationL(TUid::Uid( KSAnimMifPluginImplUid ), iDtorKey, &iObserver );
+    //  EUNIT_ASSERT( !ptr );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestUnknownFileL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestUnknownFileL()
+    {
+    iTestObj->Load( iFs, KUnknownFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+   // EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNotFound );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::TestCorruptFileL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestCorruptFileL()
+    {
+    iTestObj->Load( iFs, KCorruptFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrCorrupt );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestNoFramesFileL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestNoFramesFileL()
+    {
+    iTestObj->Load( iFs, KNoFramesFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+ //   EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrCorrupt );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestLoadStillImageL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestLoadStillImageL()
+    {
+    iTestObj->Load( iFs, KStillImageFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestLoadScaledAnimationL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestLoadScaledAnimationL()
+    {
+    iTestObj->Load( iFs, KScaledAnimationFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestLoadUnscaledAnimationL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestLoadUnscaledAnimationL()
+    {
+    iTestObj->Load( iFs, KUnscaledAnimationFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+ //   EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestLoadNoMemoryL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestLoadNoMemoryL()
+    {
+    iTestObj->Load( iFs, KUnscaledAnimationFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+   // EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNoMemory );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestCancelLoadL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestCancelLoadL()
+    {
+    iTestObj->Load( iFs, KUnscaledAnimationFile, iWaiter->iStatus );
+    iWaiter->Activate();
+    iTestObj->Cancel();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+   // EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone ); // Load is syncronous
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestShowStillImageL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestShowStillImageL()
+    {
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+ //   EUNIT_ASSERT_EQUALS( iFrameCounter, 1 );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestShowAnimationL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestShowAnimationL()
+    {
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+   // EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+   // EUNIT_ASSERT( iFrameCounter > 1 );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestCancelStillImageL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestCancelStillImageL()
+    {
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    iTestObj->Cancel();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+   // EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrCancel );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::TestCancelAnimationL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestCancelAnimationL()
+    {
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    iTestObj->Cancel();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrCancel );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::TestCancelNotActiveL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestCancelNotActiveL()
+    {
+    iTestObj->Cancel();
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestShowBeforeLoadL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestShowBeforeLoadL()
+    {
+    //EUNIT_ASSERT_PANIC( iTestObj->Start( iWaiter->iStatus ), "STARTUPANIMATION", 2 );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTSanimmif::TestSetDisplayModeL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestSetDisplayModeL()
+    {
+    iTestObj->SetDisplayMode( EGray2 );
+    iTestObj->Load( iFs, KStillImageFile, iWaiter->iStatus );
+    iTestObj->SetDisplayMode( ENone );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    iTestObj->SetDisplayMode( EColor16MA );
+    iTestObj->SetDisplayMode( EColor16MU );
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+   // EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    iTestObj->SetDisplayMode( EColor256 );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestSetSizeL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestSetSizeL()
+    {
+    iTestObj->SetSize( TSize( 10, 10 ) );
+    iTestObj->Load( iFs, KStillImageFile, iWaiter->iStatus );
+    iTestObj->SetSize( TSize( 10000, 10000 ) );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    iTestObj->SetSize( TSize( 0, 0 ) );
+    iTestObj->SetSize( TSize( 2, 1000 ) );
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    iTestObj->SetSize( TSize( 1, 1 ) );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestSetFrameDelayL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestSetFrameDelayL()
+    {
+    iTestObj->SetFrameDelay( 100 );
+    iTestObj->Load( iFs, KUnscaledAnimationFile, iWaiter->iStatus );
+    iTestObj->SetFrameDelay( 0 );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+  //  EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    iTestObj->SetFrameDelay( 12000 );
+    iTestObj->SetFrameDelay( 50 );
+    iTestObj->Start( iWaiter->iStatus );
+    iWaiter->Activate();
+    CActiveScheduler::Start(); // Waiter stops it when request completes.
+    //EUNIT_ASSERT_EQUALS( iWaiter->iStatus.Int(), KErrNone );
+    iTestObj->SetFrameDelay( 3 );
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimMifPluginTestSuite::TestBackroundColourL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CTSanimmif::TestBackroundColourL()
+    {
+    TRgb colour = iTestObj->BackroundColour();
+   // EUNIT_ASSERT_EQUALS( colour, TRgb() ); // Empty
+    return KErrNone;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CTSanimmif::ExampleL
+// Example test method function.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTSanimmif::ExampleL( CStifItemParser& aItem )
+    {
+
+    // Print to UI
+    _LIT( KTSanimmif, "TSanimmif" );
+    _LIT( KExample, "In Example" );
+    TestModuleIf().Printf( 0, KTSanimmif, KExample );
+    // Print to log file
+    iLog->Log( KExample );
+
+    TInt i = 0;
+    TPtrC string;
+    _LIT( KParam, "Param[%i]: %S" );
+    while ( aItem.GetNextString ( string ) == KErrNone )
+        {
+        TestModuleIf().Printf( i, KTSanimmif, 
+                                KParam, i, &string );
+        i++;
+        }
+
+    return KErrNone;
+
+    }
+
+
+// End of File