text:
//
//  SonarFrameworks.cpp
//  Sonar Cocos Helper
//
//  Created by Sonar Systems on 03/03/2015.
//

#include "SonarFrameworks.h"

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include <android/log.h>
#define CLASS_NAME "sonar/systems/framework/SonarFrameworkFunctions"
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "IOSCPPHelper.h"
#endif

using namespace SonarCocosHelper;

std::string UI::Audio::offButtonString = "";
std::string UI::Audio::offButtonPressedString = "";
std::string UI::Audio::onButtonString = "";
std::string UI::Audio::onButtonPressedString = "";
std::string UI::SoundEffects::offButtonString = "";
std::string UI::SoundEffects::offButtonPressedString = "";
std::string UI::SoundEffects::onButtonString = "";
std::string UI::SoundEffects::onButtonPressedString = "";
std::string UI::Music::offButtonString = "";
std::string UI::Music::offButtonPressedString = "";
std::string UI::Music::onButtonString = "";
std::string UI::Music::onButtonPressedString = "";

void IOS::Setup( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    IOSCPPHelper::Setup( );
#endif
}

void IOS::Share( cocos2d::__String shareString, cocos2d::__String imagePath )
{
#if SCH_IS_SOCIAL_ENABLED == true
    IOSCPPHelper::shareWithString( shareString, imagePath );
#endif
}

bool GooglePlayServices::isSignedIn()
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonBoolCall(
			"isSignedIn",
			CLASS_NAME);
	#endif

		return false;
}

void GooglePlayServices::signIn()
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"gameServicesSignIn",
			CLASS_NAME);
	#endif
}

void GooglePlayServices::signOut()
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"gameServicesSignOut",
			CLASS_NAME);
	#endif
}

void GooglePlayServices::submitScore(const char* leaderboardID, long score)
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"submitScore",
			CLASS_NAME,
			leaderboardID,
			score);
	#endif
}

void GooglePlayServices::unlockAchievement(const char* achievementID)
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"unlockAchievement",
			CLASS_NAME,
			achievementID);
	#endif
}

void GooglePlayServices::incrementAchievement(const char* achievementID, int numSteps)
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"incrementAchievement",
			CLASS_NAME,
			achievementID,
			numSteps);
	#endif
}

void GooglePlayServices::showAchievements()
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"showAchievements",
			CLASS_NAME);
	#endif
}

void GooglePlayServices::showLeaderboards()
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"showLeaderboards",
			CLASS_NAME);
	#endif
}

void GooglePlayServices::showLeaderboard(const char* leaderboardID)
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"showLeaderboard",
			CLASS_NAME,
			leaderboardID);
	#endif
}

void GameCenter::signIn( )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterLogin( );
#endif
}

void GameCenter::showLeaderboard( )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterShowLeaderboard( );
#endif
}

void GameCenter::showAchievements( )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterShowAchievements( );
#endif
}

void GameCenter::submitScore( int scoreNumber, cocos2d::__String leaderboardID )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterSubmitScore( scoreNumber, leaderboardID );
#endif
}

void GameCenter::unlockAchievement( cocos2d::__String achievementID )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterUnlockAchievement( achievementID, 100.0f );
#endif
}

void GameCenter::unlockAchievement( cocos2d::__String achievementID, float percent )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterUnlockAchievement( achievementID, percent );
#endif
}

void GameCenter::resetPlayerAchievements( )
{
#if SCH_IS_GAME_CENTER_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::gameCenterResetPlayerAchievements( );
#endif
}

/*void Facebook::SignIn()
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
			return JniHelpers::jniCommonVoidCall(
				"FacebookSignIn",
				CLASS_NAME);
	#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
		//TODO
	#endif
}*/

void Facebook::Share(const char* name,const char* link, const char* description, const char* caption, const char* imagePath )
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
			return JniHelpers::jniCommonVoidCall(
				"FacebookShare",
				CLASS_NAME,
				name,
				link,
				description,
				caption,
				imagePath);
	#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_SOCIAL_ENABLED == true
            IOSCPPHelper::shareViaFacebook( description, imagePath );
        #endif
	#endif
}

void Twitter::Tweet(const char* tweet,const char* title, const char *imagePath)
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		JniHelpers::jniCommonVoidCall(
			"TwitterTweet",
			CLASS_NAME,
			tweet,
			title);
	#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_SOCIAL_ENABLED == true
            IOSCPPHelper::shareViaTwitter( tweet, imagePath );
        #endif
	#endif
}

void Mopub::showBannerAd()
{
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
        return JniHelpers::jniCommonVoidCall(
                                         "ShowBannerAdMP",
                                         CLASS_NAME
                                         );
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_MOPUB_ENABLED == true
            IOSCPPHelper::showMopubBanner();
        #endif
    #endif

}

void Mopub::hideBannerAd()
{
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
        return JniHelpers::jniCommonVoidCall(
                                         "HideBannerAdMP",
                                         CLASS_NAME
                                         );
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_MOPUB_ENABLED == true
            IOSCPPHelper::hideMopubBanner();
        #endif
    #endif

}

void Mopub::showFullscreenAd( )
{
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
        return JniHelpers::jniCommonVoidCall(
                                         "ShowFullscreenAdMP",
                                         CLASS_NAME
                                         );
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_MOPUB_ENABLED == true
            IOSCPPHelper::showMoPubFullscreenAd();
        #endif
    #endif

}

void AdMob::showBannerAd()
{
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"ShowBannerAd",
			CLASS_NAME,
            AdBannerPosition::eTop);
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_AD_MOB_ENABLED == true
            IOSCPPHelper::showAdMobBanner( AdBannerPosition::eTop );
        #endif
	#endif
}

void AdMob::showBannerAd(int position)
{
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"ShowBannerAd",
			CLASS_NAME,
			position);
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_AD_MOB_ENABLED == true
            IOSCPPHelper::showAdMobBanner( position );
        #endif
	#endif
}

void AdMob::hideBannerAd()
{
    #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"HideBannerAd",
			CLASS_NAME);
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_AD_MOB_ENABLED == true
            IOSCPPHelper::hideAdMobBanner( eBoth );
        #endif
	#endif
}

void AdMob::hideBannerAd( int position )
{
	#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"HideBannerAd",
			CLASS_NAME,
			position);
    #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        #if SCH_IS_AD_MOB_ENABLED == true
            IOSCPPHelper::hideAdMobBanner( position );
        #endif
	#endif
}

void AdMob::showFullscreenAd()
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"ShowFullscreenAdAM",
			CLASS_NAME);
   #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	#if SCH_IS_AD_MOB_ENABLED == true
        IOSCPPHelper::showAdMobFullscreenAd( );
    #endif
#endif
}

void AdMob::preLoadFullscreenAd()
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"PreLoadFullscreenAdAM",
			CLASS_NAME);
   #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	#if SCH_IS_AD_MOB_ENABLED == true
        //todo
    #endif
#endif
}

void AdMob::showPreLoadedFullscreenAd()
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"ShowPreLoadedFullscreenAdAM",
			CLASS_NAME);
   #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	#if SCH_IS_AD_MOB_ENABLED == true
        //todo
    #endif
#endif
}

void RevMob::showFullscreenAd()
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	return JniHelpers::jniCommonVoidCall(
		"ShowFullscreenAd",
		CLASS_NAME);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_REVMOB_ENABLED == true
        IOSCPPHelper::showRevMobFullScreenAd( );
	#endif
#endif
}

void RevMob::showPopupAd( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
      			"ShowPopUpAd",
			CLASS_NAME);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_REVMOB_ENABLED == true
        IOSCPPHelper::showRevMobPopupAd( );
	#endif
#endif
}

void RevMob::showBannerAd( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_REVMOB_ENABLED == true
        IOSCPPHelper::showRevMobBanner( );
    #endif
#endif
}

void RevMob::hideBannerAd( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_REVMOB_ENABLED == true
        IOSCPPHelper::hideRevMobBanner( );
    #endif
#endif
}

void Chartboost::showFullscreenAd( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	return JniHelpers::jniCommonVoidCall(
		"ShowFullscreenAdCB",
		CLASS_NAME);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_CHARTBOOST_ENABLED == true
        IOSCPPHelper::showChartboostFullScreenAd( );
	#endif
#endif
}

void Chartboost::preLoadFullscreenAd()
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"PreLoadFullscreenAdCB",
			CLASS_NAME);
   #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	#if SCH_IS_AD_MOB_ENABLED == true
        //todo
    #endif
#endif
}

void Chartboost::preLoadVideoAd()
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return JniHelpers::jniCommonVoidCall(
			"PreLoadVideoAdCB",
			CLASS_NAME);
   #elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	#if SCH_IS_AD_MOB_ENABLED == true
        //todo
    #endif
#endif
}

void Chartboost::showVideoAd( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	return JniHelpers::jniCommonVoidCall(
		"ShowVideoAdCB",
		CLASS_NAME);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_CHARTBOOST_ENABLED == true
        IOSCPPHelper::showChartboostVideoAd( );
	#endif
#endif
}

void Chartboost::showMoreApps( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_CHARTBOOST_ENABLED == true
        IOSCPPHelper::showChartboostMoreApps( );
    #endif
#endif
}

void iAds::showiAdBanner( )
{
#if SCH_IS_iADS_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::showiAdBanner( AdBannerPosition::eTop );
#endif
}

void iAds::showiAdBanner( int position )
{
#if SCH_IS_iADS_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::showiAdBanner( position );
#endif
}

void iAds::hideiAdBanner( )
{
#if SCH_IS_iADS_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::hideiAdBanner( );
#endif
}

void GoogleAnalytics::setScreenName( cocos2d::__String screenName )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    return JniHelpers::jniCommonVoidCall(
                                         "SetGAScreenName",
                                         CLASS_NAME,
                                         screenName.getCString());

#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_GOOGLE_ANALYTICS_ENABLED == true
        IOSCPPHelper::setGAScreenName( screenName );
    #endif
#endif
}

void GoogleAnalytics::setDispatchInterval( int dispatchInterval )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    return JniHelpers::jniCommonVoidCall(
                                         "SetGADispatchInterval",
                                         CLASS_NAME,
                                         dispatchInterval);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_GOOGLE_ANALYTICS_ENABLED == true
        IOSCPPHelper::setGADispatchInterval( dispatchInterval );
    #endif
#endif
}

void GoogleAnalytics::sendEvent( cocos2d::__String category, cocos2d::__String action, cocos2d::__String label, long value )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    return JniHelpers::jniCommonVoidCall(
                                         "SendGAEvent",
                                         CLASS_NAME,
                                         category.getCString(),
                                         action.getCString(),
                                         label.getCString(),
                                         value);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_GOOGLE_ANALYTICS_ENABLED == true
        IOSCPPHelper::sendGAEvent( category, action, label );
    #endif
#endif
}

void AdColony::showVideoAC (bool withPreOp, bool withPostOp)
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    return JniHelpers::jniCommonVoidCall(
                                         "ShowRewardedVideoAdAC",
                                         CLASS_NAME);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_ADCOLONY_ENABLED == true
        IOSCPPHelper::showVideoAC( withPreOp, withPostOp );
    #endif
#endif
}

void Vungle::ShowVideoVungle( bool isIncentivised )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    return JniHelpers::jniCommonVoidCall(
                                         "ShowRewardedVideoAdV",
                                         CLASS_NAME,
                                         isIncentivised);
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_VUNGLE_ENABLED == true
        IOSCPPHelper::showVideoVungle( isIncentivised );
    #endif
#endif
}

UI::UI( ) { }

void UI::AddAudioToggle( const std::string &onButton, const std::string &onButtonPressed, const std::string &offButton, const std::string &offButtonPressed, cocos2d::Layer *layer, int position )
{
    audioToggleButton = ui::Button::create( onButton, onButtonPressed );

    Size visibleSize = Director::getInstance( )->getVisibleSize( );
    Vec2 origin = Director::getInstance( )->getVisibleOrigin( );

    switch ( position )
    {
        case SonarCocosHelper::UIButtonPosition::eBottomLeft:
            audioToggleButton->cocos2d::Node::setPosition( audioToggleButton->getContentSize( ).width / 2 + origin.x, audioToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eBottomRight:
            audioToggleButton->cocos2d::Node::setPosition( visibleSize.width - audioToggleButton->getContentSize( ).width / 2 + origin.x, audioToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eTopLeft:
            audioToggleButton->cocos2d::Node::setPosition( audioToggleButton->getContentSize( ).width / 2 + origin.x, visibleSize.height - audioToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eTopRight:
            audioToggleButton->cocos2d::Node::setPosition( visibleSize.width - audioToggleButton->getContentSize( ).width / 2 + origin.x, visibleSize.height - audioToggleButton->getContentSize( ).height / 2 + origin.y );

            break;
    }

    audioToggleButton->addTouchEventListener( CC_CALLBACK_2( UI::AudioTouchEvent, this ) );

    layer->addChild( audioToggleButton, 10000 );

    UI::Audio::offButtonString = offButton;
    UI::Audio::offButtonPressedString = offButtonPressed;
    UI::Audio::onButtonString = onButton;
    UI::Audio::onButtonPressedString = onButtonPressed;
}

void UI::SetAudioButtonPosition( float xPos, float yPos )
{
    audioToggleButton->cocos2d::Node::setPosition( xPos, yPos );
}

void UI::AudioTouchEvent( Ref *sender, Widget::TouchEventType type )
{
    ui::Button *node = ( ui::Button * )sender;

    std::string tempString;

    switch ( type )
    {
        case Widget::TouchEventType::BEGAN:
            // code to handle when the button is first clicked

            break;

        case Widget::TouchEventType::MOVED:
            // code to handle when the user is moving their finger/cursor whilst clicking the button
            break;

        case Widget::TouchEventType::ENDED:
            tempString = UI::Audio::offButtonString;

            UI::Audio::offButtonString = UI::Audio::onButtonString;
            UI::Audio::onButtonString = tempString;

            tempString = UI::Audio::offButtonPressedString;

            UI::Audio::offButtonPressedString = UI::Audio::onButtonPressedString;
            UI::Audio::onButtonPressedString = tempString;

            node->loadTextures( UI::Audio::onButtonString, UI::Audio::onButtonPressedString );

            float volume;

            if ( CocosDenshion::SimpleAudioEngine::getInstance( )->getEffectsVolume( ) > 0.0f )
            { volume = 0.0f; }
            else
            { volume = 1.0f; }

            CocosDenshion::SimpleAudioEngine::getInstance( )->setEffectsVolume( volume );

            if ( CocosDenshion::SimpleAudioEngine::getInstance( )->getBackgroundMusicVolume( ) > 0.0f )
            { volume = 0.0f; }
            else
            { volume = 1.0f; }

            CocosDenshion::SimpleAudioEngine::getInstance( )->setBackgroundMusicVolume( volume );

            break;

        case Widget::TouchEventType::CANCELED:
            // code to handle when the button click has been cancelled,  this is usually handled the same way as ENDED in most applications (e.g. another application takes control of the device)

            break;

        default:
            break;
    }
}

void UI::AddSoundEffectsToggle( const std::string &onButton, const std::string &onButtonPressed, const std::string &offButton, const std::string &offButtonPressed, cocos2d::Layer *layer, int position )
{
    soundEffectsToggleButton = ui::Button::create( onButton, onButtonPressed );

    Size visibleSize = Director::getInstance( )->getVisibleSize( );
    Vec2 origin = Director::getInstance( )->getVisibleOrigin( );

    switch ( position )
    {
        case SonarCocosHelper::UIButtonPosition::eBottomLeft:
            soundEffectsToggleButton->cocos2d::Node::setPosition( soundEffectsToggleButton->getContentSize( ).width / 2 + origin.x, soundEffectsToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eBottomRight:
            soundEffectsToggleButton->cocos2d::Node::setPosition( visibleSize.width - soundEffectsToggleButton->getContentSize( ).width / 2 + origin.x, soundEffectsToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eTopLeft:
            soundEffectsToggleButton->cocos2d::Node::setPosition( soundEffectsToggleButton->getContentSize( ).width / 2 + origin.x, visibleSize.height - soundEffectsToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eTopRight:
            soundEffectsToggleButton->cocos2d::Node::setPosition( visibleSize.width - soundEffectsToggleButton->getContentSize( ).width / 2 + origin.x, visibleSize.height - soundEffectsToggleButton->getContentSize( ).height / 2 + origin.y );

            break;
    }

    soundEffectsToggleButton->addTouchEventListener( CC_CALLBACK_2( UI::SoundEffectsTouchEvent, this ) );

    layer->addChild( soundEffectsToggleButton, 10000 );

    UI::SoundEffects::offButtonString = offButton;
    UI::SoundEffects::offButtonPressedString = offButtonPressed;
    UI::SoundEffects::onButtonString = onButton;
    UI::SoundEffects::onButtonPressedString = onButtonPressed;
}

void UI::SetSoundEffectsButtonPosition( float xPos, float yPos )
{
    soundEffectsToggleButton->cocos2d::Node::setPosition( xPos, yPos );
}

void UI::SoundEffectsTouchEvent( Ref *sender, Widget::TouchEventType type )
{
    ui::Button *node = ( ui::Button * )sender;

    std::string tempString;

    switch ( type )
    {
        case Widget::TouchEventType::BEGAN:
            // code to handle when the button is first clicked

            break;

        case Widget::TouchEventType::MOVED:
            // code to handle when the user is moving their finger/cursor whilst clicking the button
            break;

        case Widget::TouchEventType::ENDED:
            tempString = UI::SoundEffects::offButtonString;

            UI::SoundEffects::offButtonString = UI::SoundEffects::onButtonString;
            UI::SoundEffects::onButtonString = tempString;

            tempString = UI::SoundEffects::offButtonPressedString;

            UI::SoundEffects::offButtonPressedString = UI::SoundEffects::onButtonPressedString;
            UI::SoundEffects::onButtonPressedString = tempString;

            node->loadTextures( UI::SoundEffects::onButtonString, UI::SoundEffects::onButtonPressedString );

            float volume;

            if ( CocosDenshion::SimpleAudioEngine::getInstance( )->getEffectsVolume( ) > 0.0f )
            { volume = 0.0f; }
            else
            { volume = 1.0f; }

            CocosDenshion::SimpleAudioEngine::getInstance( )->setEffectsVolume( volume );

            break;

        case Widget::TouchEventType::CANCELED:
            // code to handle when the button click has been cancelled,  this is usually handled the same way as ENDED in most applications (e.g. another application takes control of the device)

            break;

        default:
            break;
    }
}

void UI::AddMusicToggle( const std::string &onButton, const std::string &onButtonPressed, const std::string &offButton, const std::string &offButtonPressed, cocos2d::Layer *layer, int position )
{
    musicToggleButton = ui::Button::create( onButton, onButtonPressed );

    Size visibleSize = Director::getInstance( )->getVisibleSize( );
    Vec2 origin = Director::getInstance( )->getVisibleOrigin( );

    switch ( position )
    {
        case SonarCocosHelper::UIButtonPosition::eBottomLeft:
            musicToggleButton->cocos2d::Node::setPosition( musicToggleButton->getContentSize( ).width / 2 + origin.x, musicToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eBottomRight:
            musicToggleButton->cocos2d::Node::setPosition( visibleSize.width - musicToggleButton->getContentSize( ).width / 2 + origin.x, musicToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eTopLeft:
            musicToggleButton->cocos2d::Node::setPosition( musicToggleButton->getContentSize( ).width / 2 + origin.x, visibleSize.height - musicToggleButton->getContentSize( ).height / 2 + origin.y );

            break;

        case SonarCocosHelper::UIButtonPosition::eTopRight:
            musicToggleButton->cocos2d::Node::setPosition( visibleSize.width - musicToggleButton->getContentSize( ).width / 2 + origin.x, visibleSize.height - musicToggleButton->getContentSize( ).height / 2 + origin.y );

            break;
    }

    musicToggleButton->addTouchEventListener( CC_CALLBACK_2( UI::MusicTouchEvent, this ) );

    layer->addChild( musicToggleButton, 10000 );

    UI::Music::offButtonString = offButton;
    UI::Music::offButtonPressedString = offButtonPressed;
    UI::Music::onButtonString = onButton;
    UI::Music::onButtonPressedString = onButtonPressed;
}

void UI::SetMusicButtonPosition( float xPos, float yPos )
{
    musicToggleButton->cocos2d::Node::setPosition( xPos, yPos );
}

void UI::MusicTouchEvent( Ref *sender, Widget::TouchEventType type )
{
    ui::Button *node = ( ui::Button * )sender;

    std::string tempString;

    switch ( type )
    {
        case Widget::TouchEventType::BEGAN:
            // code to handle when the button is first clicked

            break;

        case Widget::TouchEventType::MOVED:
            // code to handle when the user is moving their finger/cursor whilst clicking the button
            break;

        case Widget::TouchEventType::ENDED:
            tempString = UI::Music::offButtonString;

            UI::Music::offButtonString = UI::Music::onButtonString;
            UI::Music::onButtonString = tempString;

            tempString = UI::Music::offButtonPressedString;

            UI::Music::offButtonPressedString = UI::Music::onButtonPressedString;
            UI::Music::onButtonPressedString = tempString;

            node->loadTextures( UI::Music::onButtonString, UI::Music::onButtonPressedString );

            float volume;

            if ( CocosDenshion::SimpleAudioEngine::getInstance( )->getBackgroundMusicVolume( ) > 0.0f )
            { volume = 0.0f; }
            else
            { volume = 1.0f; }

            CocosDenshion::SimpleAudioEngine::getInstance( )->setBackgroundMusicVolume( volume );

            break;

        case Widget::TouchEventType::CANCELED:
            // code to handle when the button click has been cancelled,  this is usually handled the same way as ENDED in most applications (e.g. another application takes control of the device)

            break;

        default:
            break;
    }
}

// NOT WORKING ATM
/*
void Everyplay::setup( )
{
#if SCH_IS_EVERYPLAY_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::setupEveryplay( );
#endif
}

void Everyplay::showEveryplay( )
{
#if SCH_IS_EVERYPLAY_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::showEveryplay( );
#endif
}

void Everyplay::record( )
{
#if SCH_IS_EVERYPLAY_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::recordEveryplayVideo( );
#endif
}

void Everyplay::playLastVideoRecording( )
{
#if SCH_IS_EVERYPLAY_ENABLED == true && CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    IOSCPPHelper::playLastEveryplayVideoRecording( );
#endif
}
*/

void WeChat::shareTextToWeChat( cocos2d::__String shareString )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_WECHAT_ENABLED == true
        IOSCPPHelper::shareTextToWeChat( shareString );
    #endif
#endif
}

void WeChat::shareImageToWeChat( cocos2d::__String thumbImgPath, cocos2d::__String imgPath )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_WECHAT_ENABLED == true
        IOSCPPHelper::shareImageToWeChat( thumbImgPath, imgPath );
    #endif
#endif
}

void WeChat::shareLinkToWeChat( cocos2d::__String thumbImgPath, cocos2d::__String msgTitle, cocos2d::__String msgDescription, cocos2d::__String httpUrl )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_WECHAT_ENABLED == true
        IOSCPPHelper::shareLinkToWeChat( thumbImgPath, msgTitle, msgDescription, httpUrl );
    #endif
#endif
}

void WeChat::shareMusicToWeChat( cocos2d::__String msgTitle, cocos2d::__String msgDescription, cocos2d::__String thumbImgPath, cocos2d::__String musicUrl, cocos2d::__String musicDataURL )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_WECHAT_ENABLED == true
        IOSCPPHelper::shareMusicToWeChat( msgTitle, msgDescription, thumbImgPath, musicUrl, musicDataURL );
    #endif
#endif
}

void WeChat::shareVideoToWeChat( cocos2d::__String msgTitle, cocos2d::__String msgDescription, cocos2d::__String thumbImgPath, cocos2d::__String videoUrl )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_WECHAT_ENABLED == true
        IOSCPPHelper::shareVideoToWeChat( msgTitle, msgDescription, thumbImgPath, videoUrl );
    #endif
#endif
}

void Notifications::scheduleLocalNotification( float delay, cocos2d::__String textToDisplay, cocos2d::__String notificationTitle )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_NOTIFICATIONS_ENABLED == true
        IOSCPPHelper::scheduleLocalNotification( delay, textToDisplay, notificationTitle );
    #endif
#endif
}

void Notifications::scheduleLocalNotification( float delay, cocos2d::__String textToDisplay, cocos2d::__String notificationTitle, cocos2d::__String notificationAction )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_NOTIFICATIONS_ENABLED == true
        IOSCPPHelper::scheduleLocalNotification( delay, textToDisplay, notificationTitle, notificationAction );
    #endif
#endif
}

void Notifications::scheduleLocalNotification( float delay, cocos2d::__String textToDisplay, cocos2d::__String notificationTitle, int repeatInterval )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_NOTIFICATIONS_ENABLED == true
        IOSCPPHelper::scheduleLocalNotification( delay, textToDisplay, notificationTitle, repeatInterval );
    #endif
#endif
}

void Notifications::scheduleLocalNotification( float delay, cocos2d::__String textToDisplay, cocos2d::__String notificationTitle, cocos2d::__String notificationAction, int repeatInterval )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_NOTIFICATIONS_ENABLED == true
        IOSCPPHelper::scheduleLocalNotification( delay, textToDisplay, notificationTitle, notificationAction, repeatInterval );
    #endif
#endif
}

void Notifications::unscheduleAllLocalNotifications( )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_NOTIFICATIONS_ENABLED == true
        IOSCPPHelper::unscheduleAllLocalNotifications( );
    #endif
#endif
}

void Notifications::unscheduleLocalNotification( cocos2d::__String notificationTitle )
{
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    #if SCH_IS_NOTIFICATIONS_ENABLED == true
        IOSCPPHelper::unscheduleLocalNotification( notificationTitle );
    #endif
#endif
}

redpajama_set_name: RedPajamaGithub


text:
Results 1 - 10 of 5,444
IJCAI '97 Workshop in Intelligent Animated Agents
by unknown authors
"... Metaphor to Personality: the role of animation in intelligent interface agents Intelligent agents are beginning to appear that incorporate animated user interfaces. This paper derives 10 requirements on the interfaces to such agents in the light of the role the agent takes with respect to the user, ..."
Metaphor to Personality: the role of animation in intelligent interface agents Intelligent agents are beginning to appear that incorporate animated user interfaces. This paper derives 10 requirements on the interfaces to such agents in the light of the role the agent takes with respect to the user, the mental model the user is expected to develop of the agent, and the aspects of processes which are captured by animation. It is concluded that the main role of the animated interface is to support the marketing of the interface through the creation of an acceptable characterisation of it, rather than to support interactive use of the agent. 1
Proceedings of IJCAI-97 Workshop: Empirical AI
by Toby Walsh, Toby Walsh (editor , 1997
"... this paper, we introduce a systematic approach for constructing such assumptions. We propose a method and a tool for this purpose. The main idea is to use mathematical proofs and analysis of their failure as a systematic means for forming assumptions. A mathematical proof that a PSM solves a given p ..."
this paper, we introduce a systematic approach for constructing such assumptions. We propose a method and a tool for this purpose. The main idea is to use mathematical proofs and analysis of their failure as a systematic means for forming assumptions. A mathematical proof that a PSM solves a given problem usually enforces the introduction of assumptions to close gaps in the line of reasoning of the proof. It can therefore be viewed as a search process for hidden assumptions. Gaps that can be found in a failed proof provide already first characterizations of these assumptions. An assumption that implies the required lemma necessary to close the gap is a possible candidate we are looking for. That is, formulating this lemma as an assumption is a first step in finding and/or constructing assumptions that are necessary to ensure that the competence of a PSM is strong enough to achieve the goals as they are defined by the task. Using an open goal of a proof directly as an assumption normally leads to very strong assumptions. That is, these assumptions are sufficient to guarantee the correctness of the proof, but they are often neither necessary for the proof nor realistic in the sense that application problems will fulfil them. Therefore, further work is necessary to find improved characterizations for these assumptions. This is achieved by a precise analysis of their role in the completed proof that is used to retrace unnecessary properties of them. We provide tool support for this process by adapting the Karlsruhe Interactive Verifier (KIV) [5] for our purpose. It is the interactive character of the underlying tactical theorem prover of KIV that makes it suitable for hunting hidden assumptions. Instead of returning with a failure KIV returns with open goals that could not ...
IJCAI-97 Workshop on Issues in AI and Music- Evaluation and Assessment Issues in Evaluating Beat Tracking Systems
by Masataka Goto, Yoichi Muraoka
"... This paper discusses the main issues in evaluating beat tracking systems and proposes a method of evaluating the accuracy of these systems' output. Although there have been a few attempts to evaluate beat tracking systems, they have not sufficiently addressed quantitative evaluation of tracking accu ..."
This paper discusses the main issues in evaluating beat tracking systems and proposes a method of evaluating the accuracy of these systems' output. Although there have been a few attempts to evaluate beat tracking systems, they have not sufficiently addressed quantitative evaluation of tracking accuracy, in particular for audio signals. Our method compares subjective hand-labeled beat positions with computer-parsed beat positions and enables us to quantitatively analyze the deviation error of the tracked rhythm (beats) not only at the quarter-note level but also at the half-note and measure levels. It also considers several typical errors such as half-tempo and doubletempo errors as well as correct parsing. In testing our beat tracking system for audio signals without drum-sounds on 40 popular songs sampled from compact discs, we used the proposed method to evaluate overall recognition rates and tracking quickness and accuracy. 1
IJCAI-97 Workshop on Computational Auditory Scene Analysis Real-time Rhythm Tracking for Drumless Audio Signals | Chord Change Detection for Musical Decisions |
"... This paper presents a real-time rhythm tracking system that recognizes a rhythmic structure in musical audio signals without drum-sounds. Most previous systems dealt with MIDI signals and had di culty in processing, in real time, audio signals containing sounds of various instruments and in tracking ..."
This paper presents a real-time rhythm tracking system that recognizes a rhythmic structure in musical audio signals without drum-sounds. Most previous systems dealt with MIDI signals and had di culty in processing, in real time, audio signals containing sounds of various instruments and in tracking rhythm above the quarter-note level. Our system not only tracks beats at the quarter-note level but also recognizes rhythmic structure at the half-note and measure levels. To makemusical decisions about the audio signals, we propose a method of detecting chord changes that does not rely on chord name identi cation. The method enables the system to understand music at di erent rhythmic levels | for example, to nd the beginnings of half notes and measures | and to select the best of various hypotheses about beat positions. Experimental results show that our system is robust enough to handle audio signals sampled from compact discs of popular music. 1
Constraint Logic Programming: A Survey
by Joxan Jaffar, Michael J. Maher
"... Constraint Logic Programming (CLP) is a merger of two declarative paradigms: constraint solving and logic programming. Although a relatively new field, CLP has progressed in several quite different directions. In particular, the early fundamental concepts have been adapted to better serve in differe ..."
Constraint Logic Programming (CLP) is a merger of two declarative paradigms: constraint solving and logic programming. Although a relatively new field, CLP has progressed in several quite different directions. In particular, the early fundamental concepts have been adapted to better serve in different areas of applications. In this survey of CLP, a primary goal is to give a systematic description of the major trends in terms of common fundamental concepts. The three main parts cover the theory, implementation issues, and programming for applications.
The Elements of Statistical Learning -- Data Mining, Inference, and Prediction
by Trevor Hastie, Robert Tibshirani, Jerome Friedman
Multiagent Systems: A Survey from a Machine Learning Perspective
by Peter Stone, Manuela Veloso - AUTONOMOUS ROBOTS , 1997
"... Distributed Artificial Intelligence (DAI) has existed as a subfield of AI for less than two decades. DAI is ..."
Distributed Artificial Intelligence (DAI) has existed as a subfield of AI for less than two decades. DAI is
Abduction and Induction in AI:Report of the IJCAI'97 Workshop
by unknown authors , 1998
"... 1 Introduction Over twenty researchers participated in this IJCAI'97 workshop to dicuss the general relationship of abductionand induction. The main aim of the workshop was set out to address the issue of the relation and integration of Abdcution and Induction in the context of (practical) AI p ..."
1 Introduction Over twenty researchers participated in this IJCAI'97 workshop to dicuss the general relationship of abductionand induction. The main aim of the workshop was set out to address the issue of the relation and integration of Abdcution and Induction in the context of (practical) AI
Anisotropic Diffusion In Image Processing
by Joachim Weickert , 1996
Implicit Feedback for Inferring User Preference: A Bibliography
by Diane Kelly, Jaime Teevan , 2003
"... ... In this paper we consider the use of implicit feedback techniques for query expansion and user profiling in information retrieval tasks. These techniques unobtrusively obtain information about users by watching their natural interactions with the system. Some of the user behaviors that have been ..."
accurate than explicit measures [Nic97], but as large quantities of implicit data can be gathered at no extra cost to the user, they are attractive alternatives. Moreover, implicit measures can be combined with explicit ratings to obtain a more accurate representation of user interests. Implicit

redpajama_set_name: RedPajamaCommonCrawl


text:
5 destinations for a gay wedding in Italy
Since our engagement in Cartagena in Colombia, we've been researching wedding venues and ideas for destinations for our own ceremony. We attended our friends' gay wedding ceremony in Gallipoli in South Italy and completely fell in love, feeling totally inspired at the same time.
Although Italy remains one of Western Europe's more conservative countries with regards to LGBTQ rights and still has a ban in place for same sex marriages, steps are slowly being taken in the right direction. In particular, civil unions for same sex couples (called "unioni Civili" in Italian) were introduced in June 2016. This has spiked interest in Italy as a destination wedding for LGBTQ couples.
Following on from our travels in Italy and researching the best places for our own wedding, we've put together our 5 best destinations for a gay wedding in Italy:
Quick jump:
Gorgeous Gallipoli in Puglia
Venice: the ultimate fairytale wedding
Positano: amor on the Amalfi Coast
Fabulous Florence in Tuscany
Romance in the Italian Lakes
Pin me for later
Gallipoli is the main gay hotspot in the Puglia region of Italy. Over the years it's grown massively with gay tourists, due to its mix of gay friendly beaches and fun gay events. This has made it ideal for gay wedding destination in Italy.
We attended our friends' Unioni Civili at Villa dei Fiori Eventi, located just outside of Gallipoli main town and absolutely loved it. The registrar from the town hall attended to officiate the ceremony, which was held outdoors. Everything was spot on, from the choice of music, decor, food and music. Definitely one to consider, especially as Puglia has so much to offer gay travellers for a honeymoon. Also check out our 5 best gay friendly hotels in Puglia for more inspiration.
Attending our friends' gay civil union ceremony in Gallipoli
We celebrated our first year anniversary together in this unique gorgeous city. Everyone knows and loves Venice whether it's from movies like James Bond "Casino Royale", or from your history lessons at school. Venice has many options for gay weddings and is also the fairytale honeymoon destination for most months of the year.
Companies like Eva Meneghelli and Ema Giangreco specialise in LGBTQ weddings in Venice. The Town Hall Palazzo Cavalli is a pretty sweet location in central Venice for the ceremony, and we also love the idea of having part of our own wedding ceremony taking place through the canals or on a gondola ride, similar to what this cute lesbian couple did:
The Amalfi Coast is a UNESCO World Heritage site with over 50km (30 miles) of coastline. It's located along the southern edge of Italy's Sorrento Peninsula, around 1.5 hours drive south from Napoli.
We love the abundance of gay friendly luxury villas here as well as there being lots of things to do in the Amalfi Coast for a honeymoon.
Convento di Santa Croce in Positano is one of our favourite spots for a gay wedding. The entire town sits on a mountain cliff, which itself is a gorgeous backdrop. As a bonus, it's also west-facing, so you're guaranteed a very photogenic sunset almost every evening. This is one of our favourite gay wedding ceremonies from the Amalfi Coast we've seen:
Tuscany is one of our favourite regions in Italy. The main city, Florence is a walking open air museum, filled with Renaissance architecture, and of course home to Michelangelo's "David" sculpture.
The area surrounding Florence is surrounded by Tuscanian vineyards, olive groves and popular spots like Sienna, Pisa. This makes Tuscany ideal for as a gay wedding destination in Italy because you can have the ceremony in Florence, then honeymoon in the region. Our favourite spot is Lucca town, around 1 hour away, which is also the birth town of Puccini.
We love the civil ceremony that this cute couple did at the Piazza della Signoria palace in Florence:
There are 5 major lakes in the Italian lake district – Lakes Maggiore, Lugano, Como, Iseo and Garda, each with its unique character. We particularly fell in love with Lake Como, a glacier-lake with a maximum depth of 425 metres (1,395 feet), making it one of the deepest lakes in Europe. It's also one of our favourite romantic places in Italy. For Star Wars fans, you'll recognise it in Attack of the Clones when Luke and Padmé were wooing each other…all of that was filmed right here!
Lakes Como and Garda in particular have been popular retreats for celebrities and aristocrats since the Roman times. They have many ancient villas and palaces where you can not only have your ceremony, but also stay in for a luxurious honeymoon. One that particularly stood out for us is this ceremony at Lonato Castle which overlooks Lake Garda:
OUR FAVOURITE TRAVEL TIPS
⭐ TRAVEL INSURANCE — We recommend you always take out travel insurance before your next vacation. What happens if you suffer from illness, injury, theft or a cancellation? With travel insurance, you can have peace of mind and not worry. We love World Nomads travel insurance and have been using it for years. Their comprehensive coverage is second to none and their online claims process is very user friendly.
⭐ SAFETY & SECURITY — All travelers (gay or not) can sometimes encounter danger when traveling. CloseCircle is your "virtual body guard" mobile app which provides security alerts and support wherever you are in the world. They have a 24/7 emergency response team monitoring their users who will contact you immediately if the SOS swipe button is activated. Support can include anything from practical advice, to free evacuation from areas with extreme weather or security risks. You can read more about CloseCircle in our article about how to stay safe whilst traveling.
⭐ ONLINE ANONYMITY — A VPN (Virtual Private Network) is a must in many countries: it allows you to surf anonymously and maintain your privacy whilst traveling. You'll particularly need it in countries where gay dating apps are blocked by the government. We recommend ExpressVPN, a reliable and cost effective service which we used and loved during our travels.
⭐ HOTELS or APARTMENTS — When we plan a trip, we always look for the best hotel deals. We love Booking.com because not only do they have a comprehensive listing of accommodation options, they also offer the best prices. Added bonus: they provide 24/7 support and free cancellation for most listings.
⭐ SIGHTSEEING and ADVENTURES — When we travel somewhere, we like to seek out the best experiences, whether it is cooking with locals in Bangkok, hiking on a glacier in Patagonia, or going on a wildlife safari in Sri Lanka. Our favorite place to look is GetYourGuide because they have over 30,000 highly rated activities, a user-friendly booking process with free cancellation and a 24 hour customer support.
This article contains affiliate links. If you click on them, we may receive compensation which keeps our website alive and helps us bring you to more destinations.
Hi there! We are Stefan and Sebastien, Greek/French couple behind the travel blog Nomadic Boys. Since we met in 2009, we have been travelling all around the world together, visiting over 100 countries.
Our mission is to inspire you, the gay traveller, and show you that you can visit more places in the world than you thought possible, by providing a first-hand account of our travel adventures, to help you plan a fun and safe trip.
To find out more about us
6 thoughts on "5 destinations for a gay wedding in Italy"
Lorenzo Traveller
12 September, 2018 at 9:02 am | Reply
Very helpful article! Italy is one of the most romantic places in the world and an ideal solution for wedding!
Nomadic boys
Agreed😍
21 August, 2018 at 9:18 pm | Reply
A wonderful blog post with lots of beautiful pictures. Here you have provided a lot of useful information about the country, food and activities that can be performed in.
All these spots look beautiful guys. Puglia has been popping up on my travel radar recently. Tweeted.
Thanks Ryan!
Follow our adventures by email


When you have designed your ideal layout it is time to start working out the details. The most important factor is the floor and the drainage. This can be the most complicated part of the process but DIY Wetroom is here to make it easier to choose the best solution for your situation.
There are many ways of making a practical and reliable wetroom floor. All techniques involve creating slope in the floor towards the drain and "tanking" or sealing the floor and the walls to ensure no water can make its way through to the building structure.
The easiest way to perform both these requirements is with a Wetroom Kit. These come with all the necessary bits including a matching drain so you can have confidence in the job you are doing. The variety of kits caters for virtually all situations and designs. However DIY wetroom also supplies components for bespoke areas so the options are unlimited.
For this guide we will keep things simple and explain just the kits.
In order to select a kit, decide on:-.
2. What the existing floor structure is.
Level access or a flat floor is the ideal that most people are after in a wetroom. If for some reason this isn't possible then a raised area can always be created. The DIY Wetroom guides show how the level access is possible in almost all situations.
From your design you should be able to see the area of the floor that needs to slope down to the drain. This area should cover the area where most of the water falls directly from the shower head or from your body. In our Design PDF we assume an overhead shower will give a wet area of approximately 500mm radius from the shower head. The size of this area can be cut down by using a screen . If the screen is supported above the floor the sloping area should extend past it by around 100mm.
What is the Existing Floor Structure?
Most uppers floor in a building are suspended timber floors. These are timber beams with either floor boards or chipboard sheets over the top. The ground floors of many pre-war buildings are of a similar construction. These floors give an accessible cavity in which the drain and associated waste pipe can be located. If you can see the floor it is often possible to work out exactly where the joists are and which direction they run to work out a position for the drain and the pipe run.
Later buildings would have a sand and cement screed over a concrete slab and modern builds will have insulation in the floor as well. In all cases on a ground floor it will be possible to cut and breakout enough concrete to recess the drain and waste pipe.
If it is a solid suspended floor the structural elements should not be cut through although parts of the top screed can be removed.
If the floor contains wet under floor heating then great care should be taken. It is likely that the wet room floor will have to be raised slightly to accommodate the drain and waste pipe.
If fitting a standard drain and waste on to a solid floor restricts your perfect design a solution is available. An ultra slim pumped drain is available these also allow a wet room to be installed in basements, below normal drainage levels.
The easiest type of kit to install is the Maxxus structural deck. This is a solid reinforced deck that can span joists so the existing floor boards or chipboard can be cut away and the Maxxus deck fixed in their place to give a level floor. Various sizes are available for use with a square/round or linear drain. The Maxxus is also suitable for vinyl covering instead of tiling.
Structural wetroom deck set in to existing timber floor.
Other decks require structural support between the joists so these are normally laid on top of the existing floor, the rest of the floor is then raised by overlaying chipboard or tile backer board. This will raise the floor level by a minimum of 18mm but is a good way to ensure the complete floor is stable for tiling especially if the floor is floor boards.
It is possible to support a foam cored deck of this type after removing the floor boards or chipboard with a bit of joinery to produce a flat surface flush with top of the joists.
Any kit can be used on a solid floor as the floor will give all the necessary structural support. For this reason the low cost foam cored kits are usually chosen.
Note: All decks can be cut down in size to fit your exact space.
The waste pipe from the Wetroom drain is almost always 40mm plastic pipe (solvent weld, not pushfit). This has to be routed in such a way that it has minimum joints and angles and gives a minimum fall over its length of 18mm per metre. All the DIY Wetroom drains and trap comply with British Standards and Building regulations, you must ensure that the connection to the waste stack or drain also complies with building regulations.
The DIY Wetroom drain traps are all accessible from above by removing the grid so they can be cleaned and cleared from above. Once fitted no access to the underfloor area is required.
This is a consideration for choosing the ideal kit. For suspended timber floors it makes a much easier installation if the drain and waste pipe fits between two joists . If the joist run in the wrong direction then the Joists will have to be drilled. The fewer that need drilling, the easier the job (for more details see "Tips for Wetroom Drains"). With a solid floor shorter runs mean less depth and length needs cutting a breaking out.
DIY Wetroom kits are available with various drain outlet depths. These give a waste pipe centre lines between 27mm to 80mm below the Deck. Vertical outlet options are also available.
Taking in to account the minimum fall of 18mm in 1m the illustration below shows space needed over a number of pipe lengths.
View the full range of deck kits available , choose the type and size that will be perfect for your project.
For technical queries or bespoke formers please contact us.


text:
Q: google play store warning: App Bundle contains native code, and recommend to upload deobfuscation file When I am trying to update my existing ionic 4 application on the google play store which don't have any native code,
I am just promoting my app from the alpha channel to the production channel.
It shows 2 warning messages:

*

*This App Bundle contains Java / Kotlin code, which can be deobfuscated. We recommend uploading a deobfuscation file so that your
crashes and ANRs can be more easily analyzed and resolved

*This App Bundle contains native code and you have not uploaded any debugging symbols. We recommend uploading a symbol file so that your
crashes and ANRs can be more easily analyzed and resolved.

does anyone have an idea of how to get rid of these warning messages?

A: If you've built the App Bundle by Unity, the first warning can be solved by going to Project Settings -> Player -> Publishing Settings and changing "Release" from NONE to PROGUARD.

redpajama_set_name: RedPajamaStackExchange


I don't count calories and I don't spend hours in the gym.
The "diet" I follow is to eat the foods that suit my body and my lifestyle.
The simple truth is that looking after yourself takes consistent daily effort.
Is it hard work? Sometimes, yes.
Is it worth it? Always, yes!
You probably arrived at this page because you're looking for a program to help you lose weight, or improve your health.
I will definitely help you with that, and it's going to be different from what you're probably expecting!
You see, I won't tell you to follow one particular diet, or to eat exactly as I do, or even to train the same way I do.
Why not? Because, you're not me!
Different things work for different people. My expertise lies in giving you the basics, and helping you to figure out what works best for you.
I won't beat about the bush; if you want long lasting results, it will take time.
You need to know that, but I'm guessing that's why you're here. You've already tried a lot of the programs, pills & quick fixes out there.
Now that you know they don't last very long, you're here for something better.
Join the Wendy's Way Community to learn more about me and how it all works.
You'll also get free weekly email updates, tips & recipes.
And you can download my "healthy breakfasts" eBook as a welcome gift.
Or, you can dive right on into The Healthy Normal Revolution ….
Do you know what would happen if you stopped using the old fashioned "all or nothing" approach? You know, where you start your new diet plan on Monday, make lots of changes all at once, and then quit a few weeks later because it's all just too hard.
What if you started with just one tiny change instead, what would happen?
Progress! You'd start to make progress.
Yep, and you'd celebrate your first small win, cos that's what I encourage all of my members to do.
Then you'd move on to the next small change, celebrate that win, and so on. Rinse and repeat, until you have a fit, healthy body and a lifestyle to match.
The Healthy Normal Revolution is not like any other weight loss or healthy living program you've tried.
You get 24/7 online access to all of the tools you need: the Healthy Living 101 course, recipe library, training library, and lots of other videos, fact sheets and resources.
The key, however, is working out which bits you need, and when & how to use them to best suit you. And that happens in the forum.
It's a combination of group and personalised coaching, where you set your goals and track your progress.
I'm there to guide you and answer your questions. The other members will cheer you on.
There's no pressure or deadlines: just support, accountability and progress.
1. I met, and married, my husband Jayson, on a tropical island in North Queensland.
2. We had our honeymoon in Paris, and then lived in the UK for several years, running pubs.
3. I once (unintentionally!) took a shower with a bird eating spider.
4.I used to be super fit in the 90's. I worked as a trainer, taught aerobics classes and in my spare time I did triathlons & half marathons.
5. The UK is where I was born, but I grew up in Australia. I've lived in a lot of different places, including Ayers Rock Resort and Dunk Island.
6. My favourite place to be is at the beach. Walking, running or just to clear the cobwebs.
7. My first career was in fashion, and I also worked in hospitality for a few years. Health & fitness has always been my true passion though, and what I do best.
8. I love to have a glass of wine with dinner – Pinot Grigio is my favourite.
9. I'm a big Netflix fan. Jayson and I watch our favourite shows most nights after dinner.


Home Uncategorized	Every One Of My Model Trains Appears In This Video!
All twelve of the G-scale locomotives in my collection make an appearance in this video. I created the biggest model train layout I've ever done inside my house, and had fun watching the trains run inside and outside of the house.
If you watch the video with a pair of headphones on, you'll hear some pretty cool stereo sound.
Note the fairly amazing shot beginning at 11:35 in to the video. Thanks to the excellent "HyperSmooth" image stabilization of the new GoPro Hero 7 Black, I was able to get some incredible video of Thomas The Tank Engine flying down the track at high speed. It almost looks like it was shot from a drone flying alongside Thomas.
Trivia fact: A wheel on one car of the Coca Cola train came off the track when it was just out of view of the camera at the 1:45 point in the video. If you listen closely, you can hear it on the audio track.
2nd Trivia fact: In order to fit all those trains in what is normally our dining room, I had to temporarily take apart and store the dining room table. You can see it at the 2:00 point in the video.


text:
HomeEDUCATION82 DOCTORS, 26 LAWYERS, 92 OTHER GRADUATES JOIN NIGERIAN ARMY
82 DOCTORS, 26 LAWYERS, 92 OTHER GRADUATES JOIN NIGERIAN ARMY
A total of 200 graduates, who participated in the Nigerian Army's 2017 Direct Short Service Commission, DSSC,were fully enlisted Saturday, into the service of the Nigerian Army.
A cross section of NDA Cadets' Mass Band during the Passing Out Parade of Regular Course 59 and Short Service Course 40. Photo credit: NDA Their enlistment came following their successful completion of their professional training at the Nigerian Army School of Infantry, Jaji, in Kaduna, Kaduna State.
Out of the number, 82 of them were medical doctors out of which eight were consultants in various fields of Medicine. Also, 26 others, according to a statement from the Director, Army Public Relations, Brigadier General Sani Usman, were lawyers just as 21 others were Public Relations specialists.
The statement stated that 18 others also were enlisted with specialty to Army Aviation and Engineering just as 19 others were protestant Chaplaincy. In the same vein, 21 others were identified as having deep knowledge of the Catholic faith, while three also had specialty in Islamic Affairs .
"The full statement from Usman read:"Passing Out Parade/Commissioning and Oath taking Ceremony of 200 Officer Cadets of Direct Short Service Commission 23/2016 at the Nigerian Army School of Infantry, Jaji, and Kaduna which is presided by the Reviewing Officer and Special Guest of Honour, Mansur Muhammad Dan-Ali, Honourable Minister of Defence. " The cadets comprised of 82 Medical Doctors out of which 8 are Consultants in various fields of Medicine, 26 Lawyers, 21 Public Relations specialists, 18 with specialty to Army Aviation and Engineering, 19 Protestant Chaplaincy, 21 Catholic, 23 Islamic Affairs specialists.
"It is unprecedented in the history of the Nigerian Army and great boast to the strength of the Officer Corps of the Nigerian Army by the Chief of Army Staff, Lieutenant General TY Buratai."


text:
Ukrainian PM urges EU to stand firm against Russia, as more weapons requested
By Vincenzo Genovese with AP • Updated: 05/09/2022
Ukrainian Prime Minister Denys Shmyhal speaks at media conference at the end of the EU-Ukraine Association Council at the European Council, Brussels on Monday, Sept. 5, 2022. - Copyright Virginia Mayo/Copyright 2022 The Associated Press. All rights reserved
Ukraine must not waver in the face of Russian aggression, according to the country's prime minister, as he urged the EU to provide more firepower.
Denys Shmyhal was in Brussels to meet with senior European officials, where he made the case for continued support for Kyiv.
"Russia wages a hybrid war in the European continent against the European Union. The gas blackmail, the oil blackmail, creation of the food crisis, migrant crisis, misinformation, cyberattacks," the Ukrainian Prime Minister said on Monday.
"But abandoning Ukraine alone against Russia - that would just be one of those steps for the further movement of Russia deeper into Europe. The only salvation is for Europe to be united."
The EU has been funneling weapons, ammunition and other assistance into Ukraine since the Kremlin invaded the country back in February.
It has also provided billions of euros in economic support. Sanctions are also gradually taking their toll on Russia's economy, but concern is mounting that EU resolve may falter as inflation and energy prices rise.
However, Shmyhal insisted that Ukraine, which has been accepted as a candidate for future EU membership, still needs more help.
"Unfortunately, we see no signs that Russia is willing to stop the war. This is why we need more modern weapons, such as air defense, missile defense, anti-ship defense" as well as armored vehicles and aircraft, he said.
But the EU's High Representative for Foreign Affairs, Josep Borrell, said the bloc will not backtrack on its commitments.
"The main message from today meeting to the all world is that the European Union will continue supporting Ukraine, whatever threat, whatever blackmail Russia can put on us," Borrell told reporters. "We will provide our support politically, financially, humanitarian and military, as long as it takes and as much as needed,"
Brussels has so far provided €2.2 billion in financial assistance to Ukraine, keeping its government afloat during the war.
It's also granted €2.5 billion in military equipment through the so-called European Peace Facility Fund.
The European Commission has just signed a new €500 million euro humanitarian support programme, but according to Jacob Kirkegaard, a senior fellow at German Marshall Fund, this is not enough.
"This is a bare minimum," Kirkegaard told Euronews. "The International Monetary Fund estimates that Ukraine needs about $5 billion per month. So, the fact the EU has pledged only a total of €9 billion is not enough in my opinion."
Ukraine war: Hundreds of thousands of Ukrainians have been forcibly deported to Russia, says US
EUROPEAN PARLIAMENT RUSSIA-UKRAINE INVASION UKRAINE WAR


You will see the highlights of World Heritage Fraser Island's amazing variety of landscape… long surf-pounded beaches, luxuriant rainforest, pristine freshwater lakes, vast desert-like sand blow, winding streams, and forest-clad dunes rising to 240 metres, among the highest in the world.
Central Station – this former logging station is now a tourist stop. Stroll along the Wanggoolba Creek boardwalk to discover the ancient King Ferns, towering Gum and Pine trees.
Lake McKenzie – enjoy a revitalising swim in the crystal blue waters and relax on the sandy white beaches… it's picture perfect!
Seventy-Five Mile Beach – as you drive along this sandy highway, you may spot birds of prey flying above or humpback whales as they migrate past (between July – November). You may wish to join the Air Fraser team for a scenic flight over the island – book with your guide on tour (optional extra).
Eli Creek – float down this fast-flowing freshwater creek pouring out 80 megalitres of water daily into the ocean.
Maheno Shipwreck – enjoy a photo stop at the rusting wreck of the Maheno washed ashore during an out-of-season cyclone in 1935 – it's one of Fraser Island's most recognisable sites.
The Pinnacles Coloured Sands – learn how these technicolour sand formations were created and the Butchulla legends surrounding them. We stop to take a picture as we drive along Seventy-Five Mile Beach.
National Park fees and fuel levies.
We do provide water, but a water bottle is always handy.


Updated Friday January 27, 2017 by Fremont Baseball Inc.
For urgent inquiries, please forward your questions to your team manager or division rep so they could help guide you to the right person. Please feel free to stop by at the board meeting if you want to talk directly with the BoD.
NOTE: This phone number is for recording voice messages only. Please leave your messages on the phone slowly and clearly. Your voice message will be transcribed into text and sent to us as an email for response.
UPDATED 3/6/2015: This number will also serve as Fremont Baseball Inc's Weather Hotline.


SALT LAKE CITY, UTAH -- President Gordon B. Hinckley, prophet of The Church of Jesus Christ of Latter-day Saints, has asked Church members to "stand tall and live the gospel," to "make each day a little better than the one before."
His latest book, "Stand a Little Taller" (Eagle Gate, $12.95) presents a collection of inspiring thoughts to elevate the mind and motivate us in reaching higher for excellence. A thought for each day of the year, paired with a verse of scripture, provides insights for living a richer, more spiritually centered life.
"Stand a Little Taller" is just 4" x 6" (10 cm x 15 cm), so it can easily fit in a jacket pocket, backpack, or purse, enabling readers to enjoy a message of counsel and inspiration whenever and wherever they can find a few moments each day. Profound thoughts on subjects such as faith, family relationships, the power of prayer, self-improvement, temple worship, and eternal life are shared in bite-sized pieces of wisdom and advice. Exquisitely designed with nature-oriented photographs, "Stand a Little Taller" is a feast for the eyes as well as the spirit.
About the Author Gordon B. Hinckley was ordained the world leader of The Church of Jesus Christ of Latter-day Saints in 1995. He and his wife, Marjorie Pay Hinckley, have been married for over 60 years, and have five children and 25 grandchildren. They live in Salt Lake City.


text:
Q: Is it possible to create chrome shortcut to open set of URLs in different tabs in same window? Is there any way to create a shortcut that opens a set of URLs in different tabs in the same browser window in Chrome browser? Similarly i want another shortcut so that i want to open another set of URL in another separate chrome window in separate tabs
EDIT :
I got the perfect solution
Create a batch file with below code :-
@echo off

start chrome --new-window "url1" "url2" "url3"

A: Came up with this solution :
@echo off

set URL1= https://www.google.com
set URL2= https://www.youtube.com
set URL3= https://stackoverflow.com

start chrome --new-window "%URL1%" "%URL2%" "%URL3%"

Save this code as batch file and just double click.
Note that there is no space before the = sign It wasn't working for me when i tried with space

A: Use bookmark feature in chrome, which will create shortcut for you to access it directly.
Goto more option in top right corner then find bookmark in  the list


Only 9 left - order now!
The HYDOR SLIM-SKIM NANO INTERNAL SKIMMER™ was developed for Nano and Mini Reef use and for aquariums up to 35 gallons. It is compact and easy to position with a magnet suction cup support.
This skimmer is quiet and slim! I have a 40 gallon reef-less tank with 7 fish and it started foaming on day 2! Nitrates are lower but not totally gone. Water changes are less frequent now.


Last day for Black Friday FREE SHIPPING SALE!
do jzx guys get discount????
CP pistons for 1JZ in stock!
FS: 1jz-gte r154 2400$ !!!!!
MK3 poly bushing kit... will it cross over to the X8?
$1500 Driftmotion turbo kit improvements!!!
Hello from Aaron and Dave at Driftmotion!!!


Here comes this Ramadan where you are going to meet your fiancé's whole family for the very first time. You can't help but freak out because it is either you make it or break it. You just feel like the whole destiny of your relationship is in your hands, and all that you want is to seem cool enough for her family.
So here is what you are going to do to impress your fiancé's fambam!
Choose a really nice outfit where you feel pretty/handsome. Don't overdo it or you'll be the talk of the whole 3ozoma. Just look decent.
Don't forget to do your homework and ask your fiance about her/his family's preferences. You can either buy flowers or any desserts that they like. If you make the wrong choice of buying this Nutella konafa when they hate it, you'll probably be doomed for life.
This applies to you regardless of your gender. Help with setting up the table, they'll remember it for eternity. Nothing wins hearts like decency and good manners.
Even if you are quite intimidated, don't sit in the corner like a miserable person. Try to mingle and act cool, even if it feels like you are dying inside. But don't be too talkative, because you wouldn't want to come off as 'too much'.
Yes, you probably love each other too much, but it is for the greater good if you don't show off your love in front of the family. Yes, it feels good to hold hands or hug in public, but families are a bit judgemental when it comes to PDA.
Be socially smart, and sense the family's vibe. So if they are very hyped up and cheerful, then you know what to do. Be as crazy as you want, but with a limit of course. But if the family is a quiet one, then try to be up to their taste.
People will love you 10 times more if you compliment them. Saying how great the food was or how her mum looks amazing can earn you points so easily.
Be socially smart and choose the topics that are appropriate for her family. Don't discuss politics if a conflict might arise and definitely don't mention that you choose Zamalek over Ahly, if they love Ahly.
Lastly, smile but without being creepy. Smiling makes a person look prettier/more handsome than when with a neutral face.
May you impress every single family member and live a life full of happiness and success.


text:
package scripts;

import org.powerbot.script.ClientAccessor;
import org.powerbot.script.rt6.ClientContext;

public abstract class Task<C extends ClientContext> extends ClientAccessor<C> {
    public Task(C ctx){
        super(ctx);
    }
    public abstract boolean activate();
    public abstract void execute();
}


text:
What guests need to know about
Petit à Petit Lingerie's response to COVID-19
By Nicole Dortch, CEO
Petit à Petit is taking several actions to protect our employees, contractors, and guests' health and well-being and control the spread of COVID-19 (coronavirus) following the expert guidance of the CDC and local public health authorities.
ENHANCED CLEANING MEASURES: Petit à Petit is committed to caring for the health and well-being of its employees, contractors, and guests and playing a constructive role in supporting local health officials and government leaders. The company continues to observe cleaning and sanitizing protocols that meet or exceed public health guidelines and reduce the spread of COVID-19. Our locations have implemented a safety system to ensure employees and guests' well-being and clean high touch surface areas as frequently.
ADDITIONAL PRECAUTIONS: Petit à Petit is also taking precautions for every employee that works in its stores to protect them and their guests. Before beginning every shift, all employees complete a pre-check, including safety precautions such as taking their temperature, to ensure they are ready and able to work. Employees are also required to wear facial coverings during their shifts and continue to wash their hands frequently. They also have the option to wear gloves.
SAFETY PROTOCOLS: We respectfully require ALL guests to follow social distancing and safety protocols recommended by public health officials, including wearing a facial covering when visiting our stores. It is our responsibility to protect our employees and comply with local public health mandates. As such, our employees have the right and responsibility to refuse service to guests who are not wearing facial coverings.
We reserve the right to change our policies and procedures, without notice, to include store hours and operations for compliance with all regulatory and statutory policies.
For more information on COVID-19, please visit the CDC website: www.cdc.gov


◄ Search Results Showing Item 10 of 117 Preferred library: Kent Memorial Library - Suffield?
So big / Edna Ferber.
Physical Description: 252, 28 p. ; 21 cm.
Originally published: Garden City, N.Y. : Doubleday, Page, 1924.
Subject: Gamblers > Family relationships > Fiction.


Think Tank Photo recently made a tiny change (really a couple tiny changes) to a product that's so simple, and I'm impressed.
For years I have used the Think Tank Photo memory card wallets, like the Pixel Pocket Rocket. I've used wallets that hold Compact Flash cards, Compact Flash and Secure Digital cards, and only Secure Digital cards.
I have the pleasure of now owning one of these wallets, thanks to Think Tank Photo, and have now made it my main memory card wallet.
As a bonus, I discovered that each pocket can hold way more memory cards than what Think Tank Photo says. Of course, that makes the wallet bulkier. But that's OK because I usually keep it in my camera bag.
But I will surely be using it on my belt next to my Spider Holster, here and there.
So call me impressed — even with such a simple change to a simple product.


text:
World's Oldest Art Studio Found in Ethiopian Cave
People painted for over 4,000 years in Porc-Epic.
A. Herrero
For 4,500 years, ancient humans kept on coming back to one cave in Ethiopia. It's a roomy enclosure at the base of a limestone cliff, but its natural qualities were only one part of the story. People used the cave to store reddish stones rich in iron oxide, and then they turned those stones into different colors. A new study suggests that the cave, called Porc-Epic, was the world's first art studio.
Near the city of Dire Dawa, Porc-Epic has long been a focus of study because of the variety of rocks characterized by a red or yellow color or streak, known as ochre, found there. Over 4,000 pieces of ochre have been discovered at Porc-Epic and currently reside in a museum in Addis Abba. There, they were studied by Daniela Eugenia Rosso of the University of Barcelona in Spain and Francesco d'Errico and Alain Queffelec of the University of Bordeaux in France.
Pieces of ochre found in Porc-Epic.
Daniela Eugenia Rosso, Francesco d'Errico, Alain Queffelec
Ochre had any number of uses in the ancient world, including hide tanning, adhesive production, insect repellent, antiseptic treatments, and protecting oneself from the sun. Ochre pieces are "one of the most controversial features found" at any ancient site, Rosso and her colleagues say, because it can be hard to determine if its use was utilitarian, symbolic, or a combination of the two.
However, there were so many ochre pieces at the site that the three feel they can safely conclude that Porc-Epic was "largely shared by all community members and consistently transmitted through time." The cave was passed down from generation to generation, with processing techniques changing over time and reflecting new cultural situations. "Evidence for the grinding of ochre to produce small quantities of powder throughout" the cave, the researchers say, shows definitively that at least some of the ochre was used for "symbolic activities" throughout the generations.
"Of course," the scientists say, "this conclusion does not imply that all ochre powder produced at the site was used for symbolic activities." But finding, for example, a "round pebble with half its surface covered with ochre and no use-wear" suggests that the ochre pieces were being used for paint, with likely possibilities including body paint and official stamps.
Source: PLOS vis Ars
More From Archaeology
If We Find Fossils On Mars, They Could Be Fake
Russia Wants to Clone an Army of Ancient Warriors
Breakthrough: Scientists Sequence DNA From Dirt
Newton Believed Pyramids Held Apocalypse Secrets
Is This Jesus's Childhood Home?
Archaeologists Find Longest-Ever Footprint Path
Intact Brain Cells Found Inside Vesuvius Victim
Now You Can Buy a Real Friggin' T. Rex
Ancient Human Footprints Could Rewrite History
Ancient Sealed Coffins Discovered in Egypt
Archeologists Find World's Oldest Bread
World's Oldest Periodic Table Found in Storage
Explorers Say This Cave Is Now the World's Deepest
The World's Smallest Works of Art
What Was Neanderthal Art Like?
NASA Found the Oldest Molecules in the Universe


In this Nov. 19, 2016, file photo, Mark Zuckerberg, chairman and CEO of Facebook, speaks at the CEO summit during the annual Asia Pacific Economic Cooperation (APEC) forum in Lima, Peru.
Zuckerberg's commitment to step outside the Silicon Valley bubble represents an important moment for CEO leadership. More than half, 77% of voters in Santa Clara, the county that comprises Silicon Valley, voted for Hillary Clinton. Rather than retrench further into the Bay Area's bastion of progressivism, Zuckerberg understands that the future of his company – and in no small part the future of America – hinges on the willingness of our corporate leaders to understand and engage with the millions of Americans who aren't visible in their daily lives. The 2016 election demonstrated that Americans increasingly live in siloes, listening primarily to people who have similar backgrounds and perspectives. Facebook, with its near-ubiquity in the United States and 1.8 billion global users, can be a major part of the solution.
Importantly, Zuckerberg's wife, Priscilla Chan, will join him on the 30-state tour, which indicates that this is about both his role as CEO and the couple's emerging role as titans of philanthropy and social investment. Indeed, the Chan-Zuckerberg Initiative has the potential in the coming decades to be one of the great philanthropic organizations, along with the Gates Foundation, the Rockefeller Foundation, and the Ford Foundation.
Zuckerberg's tour will give him a chance to learn and lead. If orchestrated thoughtfully, it could echo Robert F. Kennedy's famous 1968 campaign tour across Eastern Kentucky, in which he sought to better understand anyone who wished to share their hopes and fears, ideas and anxieties. The tour can inspire Zuckerberg to build products and services that make life better for the broadest number of people.
The tour may have echoes of a political campaign, but Zuckerberg actually doesn't need elected office to help unite our fractured nation. We are entering the "Age of the CEO Statesman," a major shift in American political culture in which corporate executives have the opportunity to leverage their impact to push for social change, and in which people will increasingly look to executives, alongside political leaders, as change agents.
With the federal government running low on both the funds and the political will to do the big things necessary to compete in the 21st century — such as broadening access to jobs and opportunity, catalyzing entrepreneurship and providing access to capital — private sector leaders have an opportunity, and an obligation, to fill the void.
The private sector has already stepped up to fulfill many of the responsibilities that used to fall on government. Pharmaceutical and technology companies are investing heavily in research and development to fill the gap where federally-funded research no longer suffices. Major government functions, including some aspects of our national defense, are now privately outsourced. Even space travel, which half a century ago was the ultimate symbol of the U.S. government's commitment to conquering new frontiers, is now largely led by companies like SpaceX, Virgin Galactic and Blue Origin.
In the Age of the CEO Statesman, skeptics will look warily at the shift in influence from the governments to the private sector. A healthy dose of skepticism is warranted, and there is no guarantee that every company will use its newfound influence optimally. But here's the good news: just as the opportunity for influence is rising in the private sector, so too is the platform that consumers have to influence corporate decision making.
Social media gives everyone direct access to the CEOs of major companies. When consumers don't like a product or policy, they can speak with a loud voice. And when enough people take a side, companies are increasingly forced to listen and rethink their decisions. As much of this communication between consumers and companies takes place on social media, the CEO of the world's largest social platform must be especially focused on this trend.
The relationship between the newly-empowered company and the newly-empowered consumer is embryonic and evolving quickly. To some executives, the fear of a viral social media uprising in response to a new policy is ulcer-inducing. But to others, the possibility of connecting with people in a more meaningful way and achieving double bottom line success is a game-changer.
Zuckerberg's leadership of Facebook will face a number of tests in 2017, from his continued response to the fake news controversy to questions about the limits of speech and expression on the platform, particularly the emerging Facebook Live tool. His U.S. tour will be a fascinating case study in his willingness to listen and his capacity to lead. How he shares his learnings – and whether he adapts his corporate and philanthropic efforts based on what he hears – will be one of the most compelling stories of 2017. If he is successful, expect others to follow his lead.


Mike resorts to unorthodox methods when threatened by Mickey Bob; the Rowdy Brothers step up and take the interim yardman position; and George returns with big news!
Francis, who has possessed Aunt Betsy, sets out to wreak havoc on the Lumber Yard. But will he be able to overcome a pesky splinter?
Episode 215: "Fertalizin' the Cornfield" — Season Finale!
In the Season 2 finale, Francis goes completely off the deep end, Pete returns in an unexpected way and the Lumber Baron wrestles his inner self.


There's a lot going on during the four-day weekend that is Sunfest. From the live music to the games to the shopping, sometimes you need to throw down a beach blanket and just chill out. That's where the Kite Festival comes in. Walk just a few streets up the boardwalk and on the beach across from the Kite Loft you'll see the tents, the spectators and, of course, the kites.
Sunfest's high-flying sister festival is where you get to take a break from all the commotion down at the Inlet and just stare up at the sky. There's also a number of games, candy drops, sport flying demonstrations and bubble art, but I prefer to lie in the sand and watch the colors swirling in the clouds. And take the occasional photo. Because on a year when Sunfest is actually sunny and there's enough wind to keep the kites in the air, you've got to document the small miracle.
As you near the Kite Loft on 5th street, you'll start to see the line of colorful tents set up in the sand.
Outside the tents are lots of kites. Inside the tents are kite enthusiasts and even whole organizations of dedicated kite fliers.
If you're me, you might just have a mini heart attack thinking that a weirdly floppy and lightweight seagull has attacked your face, before realizing that it's just a really, really realistic seagull kite.
The closer to the water, the better the wind power.
Owl and mice kites propped up in the sand.
Rain, shine or F.O.G., the F.O.G. Fliers will be at the festival with duck n' crab kites in tow.
Is it a dinosaur? A dragon? A My Little Pony? You decide.
Animals, real and mythical, are always a common theme up in the sky.
This octopus was trying his hardest to get up into the air, but he was sort of a fish out of water.
Stick around this weekend, because there will be even more kites tomorrow?


text:
CITCA standards for training exceed any others in the industry.
We at CITCA recognize the critical importance of safety and training. It is our mission to:
Collaborate with government, industry, safety, technical and educational organizations to provide unparalleled safety training.
Provide vital leadership in establishing safety training for the
construction, wireless communication, and alternative energy industries.
Offer affordable, and superior industry-specific safety and technical training.
Establish competency-based safety training programs that exceed all government standards and guidelines.
Assist in reducing and/or eliminating serious and fatal accidents in the workplace, by providing safety and technical training that meets or exceeds regulatory and industry standards.
President and COO
Steve Wilder
Steve has spent over 30 years as a safety professional and works extensively with not only the wireless industry, but also with construction, manufacturing, and healthcare.
Under his leadership, CITCA has seen its volumes grow tenfold since it was founded in 2006, and today CITCA has become a nationally recognized leader for safety consulting and training services for the tower erection and construction industries. Steve is an experienced trial expert and has consulted for law firms and insurance companies on cases of workplace violence, wrongful death, and injury and dismemberment cases.
A member of the Safety and Education Committee of the National Association of Tower Erectors (NATE), Steve has also worked closely with the National Retail Marketing and Construction Association, with the American Society for Healthcare Risk Management, as well as with the National Fire Protection Association and the American Society of Safety Engineers.
In addition to his role with CITCA, Steve has spent his entire career in safety and training, including 35 years in the fire service, and 25 as adjunct faculty at the state fire academy at the University of Illinois.
He is the author of two books and writes safety articles for several trade journals, including his periodic articles in the NATE Tower Times magazine. In February 2017, Steve and Jocko Vermillion (Vice-President of CITCA) were co-recipients of the annual NATE Distinguished Service Award for their contributions and dedication to worker safety in the tower erection industry.
Jocko Vermillion
With over 30 years of construction safety experience, Jocko Vermillion is a nationally recognized expert in construction safety and compliance. Prior to joining CITCA, Jocko served for 10 years as a Compliance Safety and Health Officer (CSHO) with the United States Department of Labor – Occupational Safety and Health Administration (OSHA). During that time, he investigated over 100 fatal construction accidents, served as a subject matter expert in countless hearings, and provided testimony on construction safety issues to the United States Congress. During his tenure at OSHA, Jocko earned national recognition for his expertise in tower erection safety.
SENIOR SAFETY CONSULTANT
Tim Render
Tim Render serves as a senior safety consultant with CITCA. With 10 years of construction safety management experience, Tim works with CITCA clients on all areas of safety compliance.
In the spring of 2006, Tim become a Foreman in the painting department of a large Ohio construction company and was promoted to Assistant Production Manager in the fall of that year. In 2007, Mr. Render became a Service Manager for the roofing department, and in 2010, was promoted to Safety Director.
In 2007, Mr. Render was the safety director overseeing a major painting project of a one million square foot section of the International Exposition Center in Cleveland. The last time the I-X Center was painted was in 1984, and the previous paint jobs were painted with paint containing lead. After confirming the existence of lead from lab testing results, the job scope changed. Mr. Render was appointed to train all the workers and oversee the entire project to ensure the workers' safety. He was involved in the design and staging of the dirty rooms, the decontamination rooms, and the clean rooms. Mr. Render complete air samplings throughout all 4 phases of the project. He also completed all respirator fit test prior to the start of the 3-month job. The job called for 8-10 aerial lifts during the project, which Mr. Render completed additional fall protection training and assisted aerial lift refresher/practical training for all workers. For his leadership, Tim received the prestigious Diamond Safety Award.
Mr. Render attended Ohio State University and is an Authorized OSHA 10/30 Hour Trainer for the construction industry. He is also a Red Cross Instructor (Adult First Aid/CPR/AED).
Diane Mueller
As a well-known and respected veteran in the wireless communication industry, Mueller brings a wealth of skills, expertise, and resources to the CITCA team. She spent the past 24 years as a sales rep for Primus where Mueller worked for Tower companies, dealers, and vendors supporting the wireless industry in areas including sales, service, marketing, data, and more. Mueller brings with her extensive skills in client management and accounts, sales forecasting and strategy, customer service, and research. Volunteers on the Member Services Committee of the National Association of Tower Erectors (NATE), Women of NATE, and is the Wireless Industry Network (WIN )Great Lakes Ambassador.
Director of Training & Curriculum
Steve Trnka
Steve Trnka, Curriculum Coordinator, started working with CITCA in 2009, serving clients in the telecommunication, solar, and wind industries. He is one of CITCA's most sought-after instructors thanks to his expertise in rescue techniques and systems. He joined CITCA after 17 years in the fire service, where he served as lead instructor and member of the Technical Rescue Team. Since joining our team, Steve has instructed, reviewed, and continues to keep the CITCA program up to current trends and changes in technology.
Steve is a certified Rope Rescue Technician with the Illinois State Fire Marshall, a
licensed Emergency Medical Technician Paramedic, as well as an Instructor III
providing the education behind the formulation of courses, exams, and hands-on
experience. Steve has been a speaker for NATE, has been published in Tower Times
magazine, and was the 2005 recipient of 'Outstanding Rescue' for job performance.
Field Instructor
Rob Plummer
Rob Plummer has been a field instructor with CITCA for nine years, serving clients in the general industry, telecommunication, wind, and solar industries. His expertise in rescue systems and rigging instruction makes him one of CITCA's most sought after instructors. Rob is also a member of the fire service, serving as a Division Leader and member of the Central Illinois Technical Rescue Team.
Rob is a certified rope rescue technician through the Illinois State Fire Marshall, a licensed Emergency Medical Technician-Paramedic. He is Confined Space And Competent Rigger certified through the Illinois State Fire Marshal. Rob currently teaches with the University of Illinois Fire Service institute as well as Lakeland Community college.
Rob holds a Bachelor of Arts in Applied Science from Eastern Illinois University and has performed in emergency/disaster locations throughout Illinois.
Don McMasters
Don McMasters is a field instructor for CITCA since 2011, serving clients in the telecommunication, wind, solar and general industries. His tremendous expertise in rescue system components and techniques has been a vital asset to our clients. He is a member of the fire service industry, where he serves on a Central Illinois Technical Rescue Team. He has been deployed to multiple small and large-scale disasters throughout Illinois. Don is a certified rope rescue technician with the Illinois State Fire Marshal and a licensed Illinois Emergency Medical Technician as well as a Confined Space Rescue Technician and has been a speaker for NATE. Don holds two Associate Degrees from Parkland Community College and Danville Area Community College in both Applied Science and Fire Service Technology specializing in technical rescue.
Elliot Kraft
Elliot Kraft is a field instructor for CITCA since 2018. Elliot comes to us as a rescue technician in the fire service as well as an experienced tower hand, making it easy for Elliot to relate our program as it applies to the industry. Elliot is certified through the Illinois State Fire Marshal as a rope rescue technician as well as being a licensed Illinois paramedic.
Sean Carey
Sean Carey is a 19-year veteran in the tower industry. Sean began his career building towers and moved on to radio, line, and antenna. After gaining years of experience, he added structural mods and became a Certified Weld Inspector. When Sean looks back over his career, he recognizes that he has always cared most about leaving the tower safer than when he last climbed it. Whether that's teaching climbers how to be safer while in the CITCA classroom or calling out imperfections he sees while still climbing towers, Sean lives by the motto "get everyone home safe"


HSHS, Hinsdale South High School is a public four-year high school located in Darien, Illinois, a southwestern suburb of Chicago, Illinois, in the United States. It is part of Hinsdale Township High School District, which also includes Hinsdale Central High School. Hinsdale South is the regional feeder school for deaf and hard of hearing students in the Chicagoland area. Hinsdale South is Public secondary High School. It was established in1965. The Principal of school is Dr. Claudia Geocaris. The total faculty is 185 and students 1,913.
The mission of the Hinsdale South High School Foundation is to provide for the enrichment and enhancement of educational programs and opportunities through the establishment of partnerships with individuals, alumni, community organizations and corporate sponsors dedicated to the pursuit of excellence in education. The mission of Hinsdale South High School is to provide an environment in which all students will acquire the necessary skills to become responsible thinkers who appreciate diversity and are productive citizens in their community.


Enjoy one floor living in popular Country Place condominiums! Super floor plan! Formal dining room! Large living room with vaulted ceiling, box window! All appliances are included! Newer(2012) Furnace and air conditioning! Master Bedroom has ceiling fan, walk-in-closet. Note: 1 car garage and plenty of guest parking available. Amenities include: clubhouse, pool, library, baseball field, basketball courts, playscape. Water included in Association dues. Clubhouse can be rented for special occasions! Highly rated Novi school district! Located close to beautiful downtown Northville, Parmenter Cider Mill/Winery/Brewery, shopping, restaurants, and expressway! Well priced. Won't last in today's market!