<?xml version="1.0" encoding="UTF-8"?>
<plugin name="(BIM) Hide Link And Code" version_long="330003" version_human="3.3.3" author="Forumscripts.net" website="https://forumscripts.net" update_check=""><hooks><hook type="C" class="\IPS\core\modules\front\system\plugins" filename="plugins"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook401 extends _HOOK_CLASS_
{
	public function bimViewContent()
	{
		try
		{
			\IPS\Session::i()->csrfCheck();
	
			if ( \IPS\Request::i()->isAjax() )
			{		
				try
				{
					$post = \IPS\forums\Topic\Post::load( \IPS\Request::i()->id );
					$content = $post->content();
					
					$plugins = new \IPS\core\modules\front\system\plugins;
					
					if ( method_exists( $plugins, 'replaceGalleryTags' ) )
					{
						$content = $plugins->replaceGalleryTags( $content );
					}
				}
				catch( \OutOfRangeException $e ){}	
					
				\IPS\Output::i()->json( array( 'type' => 'OK', 'content' => $content ) );
				exit;
			}
	
			\IPS\Output::i()->redirect( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : \IPS\Http\Url::internal( '' ) );			
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}

	public function hideLinkAndCode( $content, $showmsg=TRUE )
	{
		try
		{
			if ( !$content )
			{
				return '';
			}
			
			$types = explode(",", \IPS\Settings::i()->bim_hide_content);
			
			if ( $types )
			{
				$msg = $showmsg ? \IPS\Member::loggedIn()->language()->addToStack('bim_hide_hideInSearch') : null;
				
				if ( \in_array("links", $types) )
				{
					preg_match_all('#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $content, $match);
					for ( $i = 0 ; $i < \count( $match[0] ) ; $i++ )
					{
						$content = str_replace( $match[0][$i], $msg, $content);		
					}
				}
				if ( \in_array("hide", $types) )
				{
					$content = preg_replace('/\[hide\](.+?)\[\/hide\]/is', $msg, $content);
				}			
			}
			
			return $content;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
}
]]></hook><hook type="C" class="\IPS\forums\Topic\Post" filename="Post"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook402 extends _HOOK_CLASS_
{
	public static $forceHide = FALSE;
	
	public function content()
	{
		try
		{
			$content = parent::content();
			$content = $this->bimHideContent( $content );
			return $content;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
	
	public static function bypassHiddenContent( \IPS\forums\Topic\Post $post )
	{
		try
		{
			if ( \IPS\Request::i()->do == 'embed' )
			{
				return FALSE;
			}
			
			if ( self::$forceHide )
			{
				if ( \IPS\Settings::i()->bim_hide_forums == "0" || \in_array( $post->item()->forum_id, explode(',', \IPS\Settings::i()->bim_hide_forums ) ) )
				{
					return FALSE;
				}
			}
	
			if ( $post->author()->member_id == \IPS\Member::loggedIn()->member_id )
			{
				return TRUE;
			}
			
		// if ( \IPS\Settings::i()->bim_hide_force_forums == "0" || \in_array( $post->item()->forum_id, explode(',', \IPS\Settings::i()->bim_hide_force_forums ) ) )
		// {
			// if ( \IPS\Settings::i()->bim_hide_force_g && \IPS\Member::loggedIn()->inGroup( explode(',', \IPS\Settings::i()->bim_hide_force_g) ) )
			// {
				// return FALSE;
			// }
		// }
			
		// if ( \IPS\Settings::i()->bim_hide_force_forums2 == "0" || \in_array( $post->item()->forum_id, explode(',', \IPS\Settings::i()->bim_hide_force_forums2 ) ) )
		// {
			// if ( \IPS\Settings::i()->bim_hide_force_g2 && \IPS\Member::loggedIn()->inGroup( explode(',', \IPS\Settings::i()->bim_hide_force_g2) ) )
			// {
				// return FALSE;
			// }
		// }		
			
			if ( \IPS\Settings::i()->bim_hide_gbypass && \IPS\Member::loggedIn()->inGroup( explode(',', \IPS\Settings::i()->bim_hide_gbypass) ) )
			{
				return TRUE;
			}
			
			if ( \IPS\Settings::i()->bim_hide_clubs == 1 && $post->item()->container()->club() )
			{
				\IPS\Settings::i()->bim_hide_forums = $post->item()->forum_id . ',' . \IPS\Settings::i()->bim_hide_forums;
			}
			else
			{
				if ( $post->item()->container()->club() )
				{
					return TRUE;
				}
			}
	
			if ( \IPS\Settings::i()->bim_hide_forums != "0" && !\in_array( $post->item()->forum_id, explode(',', \IPS\Settings::i()->bim_hide_forums ) ) )
			{
				return TRUE;
			}
	
			$unhideAction = $post->item()->container()->getUnHideAction();
	
			if ( ! \IPS\Output::i()->jsVars['unhideAction'] && \IPS\Dispatcher::i()->application->directory == 'forums' && \IPS\Request::i()->controller == 'topic' )
			{
				\IPS\Output::i()->jsVars['unhideAction'] = $unhideAction;
			}
	
			if ( $unhideAction == "like" && $post->reacted() )
			{
				return TRUE;
			}
			
			if ( $unhideAction == "reply" || $unhideAction == "both" )
			{
				static $authorIDs = array();
				
				if ( ! isset($authorIDs[ $post->topic_id ]) )
				{
					$authorIDs[ $post->topic_id ] = array();
				}
				
				if ( ! isset($authorIDs[ $post->topic_id ]['cached']) )
				{
					$authorIDs[ $post->topic_id ]['cached'] = "cached";
					$authorIDs[ $post->topic_id ] = $authorIDs[ $post->topic_id ] + iterator_to_array( \IPS\Db::i()->select( 'DISTINCT(author_id)', 'forums_posts', array( 'topic_id=? AND queued=?', $post->topic_id, 0 ) )->setKeyField( 'author_id' ) );	
				}
				
				if ( $unhideAction == "reply" )
				{
					if ( isset($authorIDs[ $post->topic_id ][ \IPS\Member::loggedIn()->member_id ]) )
					{
						return TRUE;
					}			
				}
				
				if ( $unhideAction == "both" )
				{
					if ( \IPS\Settings::i()->bim_hide_force_and == 1 )
					{
						if ( $post->reacted() && isset($authorIDs[ $post->topic_id ][ \IPS\Member::loggedIn()->member_id ]) )
						{
							return TRUE;
						}					
					}
					else
					{
						if ( $post->reacted() || isset($authorIDs[ $post->topic_id ][ \IPS\Member::loggedIn()->member_id ]) )
						{
							return TRUE;
						}
					}
				}
			}
			
			return FALSE;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
	
	public function bimHideContent($content)
	{
		try
		{
			if ( ! \IPS\Settings::i()->bim_hide_content )
			{
				return $content;
			}
	
			$types = explode(",", \IPS\Settings::i()->bim_hide_content);
			
			if ( \in_array("hide", $types) )
			{
				$content = preg_replace('/\[hide\](.+?)\[\/hide\]/is', \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->bim_hide_box("$1"), $content);
			}
	
			if ( self::bypassHiddenContent( $this ) )
			{
				return $content;
			}
	
			# Hide content
			$msg = \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' )->bim_hide_msg(self::$forceHide, $this->item()->container()->getUnHideAction());
			
			preg_match_all('#<a[^>]+href=([\'"])(.+?)\1[^>]*>(.+?)<\/a>#', $content, $match);
			
			if ( \in_array("hide", $types) )
			{
				$content = preg_replace('/<!--startHideContent-->(.+?)<!--endHideContent-->/is', $msg, $content);
			}
			
			for ( $u = 0 ; $u < \count( $match[0] ) ; $u++ )
			{
				if ( \in_array("images", $types) && \mb_stripos($match[3][$u], "<img ") !== false )
				{
					$content = str_replace( $match[0][$u], $msg, $content);				
				}
				if ( \in_array("links", $types) )
				{
					if ( mb_strpos($match[0][$u], "external") !== FALSE ) 
					{
						$content = str_replace( $match[0][$u], $msg, $content);
					}
				}
				if ( \in_array("attachment", $types) && \mb_stripos($match[2][$u], "attachment.php") !== false )
				{
					$content = str_replace( $match[0][$u], $msg, $content);				
				}						
			}	
			
			if ( \in_array("images", $types) )
			{
				$content = preg_replace('#<img((?!data-emoticon).)*src=([\'"])(.+?)\1[^>]*>#', $msg, $content);			
			}
			
			if ( \in_array("code", $types) )
			{
				$content = preg_replace('/<pre class="ipsCode(.*?)">(.+?)<\/pre>/is', $msg, $content);
			}
	
			# Done
			return $content;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
	

	public function truncated($oneLine = false, $length = 500)
	{
		try
		{
			$content = parent::truncated( $oneLine, $length );
			$content = $this->bimHideContent($content);
			return $content;		
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
	
    /**
	 * Get the snippet (stripped of HTML)
	 *
	 * @param	int		$length		The length of the snippet to return
	 * @return string
	 */
	public function snippet( $length=300 )
	{
		try
		{
			$contentField = static::$databaseColumnMap['content'];
			$content = trim( str_replace( \chr(0xC2) . \chr(0xA0), ' ', strip_tags( preg_replace( "/(<br(?: \/)?>|<\/p>)/i", ' ', preg_replace( "#<blockquote(?:[^>]+?)>.+?(?<!<blockquote)</blockquote>#s", " ", preg_replace( "#<script(.*?)>(.*)</script>#uis", "", ' ' . $this->$contentField . ' ' ) ) ) ) ) );
	
			$plugins = new \IPS\core\modules\front\system\plugins;
			$content = $plugins->hideLinkAndCode( $content );		
					
			return mb_substr( $content, 0, $length ) . ( mb_strlen( $content ) > $length ? '&hellip;' : '' );
			}
			catch ( \Error | \RuntimeException $e )
			{
				if ( method_exists( get_parent_class(), __FUNCTION__ ) )
				{
					return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
				}
				else
				{
					throw $e;
				}
			}
	}	
	
	public static function searchResult( array $indexData, array $authorData, array $itemData, array $containerData = NULL, array $reputationData, $reviewRating, $iPostedIn, $view, $asItem, $canIgnoreComments=FALSE, $template=NULL, $reactions=array() )
	{
		try
		{
			try
			{
				$post = \IPS\forums\Topic\Post::load( $indexData['index_object_id'] );
				if ( !self::bypassHiddenContent( $post ) )
				{
					$plugins = new \IPS\core\modules\front\system\plugins;
					$indexData['index_content'] = $plugins->hideLinkAndCode( $indexData['index_content'] );				
				}
			}
			catch( \OutOfRangeException $e ){}
			
			return parent::searchResult( $indexData, $authorData, $itemData, $containerData, $reputationData, $reviewRating, $iPostedIn, $view, $asItem, $canIgnoreComments, $template, $reactions );
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
		

}
]]></hook><hook type="C" class="\IPS\Notification" filename="Notification"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook508 extends _HOOK_CLASS_
{
	protected function sendEmails( $emails, $emailRecipients )
	{
		try
		{
			\IPS\forums\Topic\Post::$forceHide = TRUE;
			$return = parent::sendEmails( $emails, $emailRecipients );
			\IPS\forums\Topic\Post::$forceHide = FALSE;
			return $return;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
}
]]></hook><hook type="C" class="\IPS\Content\Search\Result\Content" filename="Content"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook679 extends _HOOK_CLASS_
{
	public function addToRssFeed( \IPS\Xml\Rss $document )
	{
		try
		{
			$class = $this->indexData['index_class'];	
			$object = $class::load( $this->indexData['index_object_id'] );
			if ( \get_class($object) == 'IPS\forums\Topic\Post' )
			{
				$plugins = new \IPS\core\modules\front\system\plugins;
				$this->indexData['index_content'] = $plugins->hideLinkAndCode( $this->indexData['index_content'] );			
			}
			$document->addItem( $object instanceof \IPS\Content\Comment ? $object->item()->mapped('title') : $object->mapped('title'), $object->url(), $this->indexData['index_content'], \IPS\DateTime::ts( $this->indexData['index_date_created'] ) );
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}
}
]]></hook><hook type="C" class="\IPS\forums\modules\front\forums\topic" filename="topic"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook916 extends _HOOK_CLASS_
{
	protected function manage()
	{
		try
		{
			parent::manage();
			$plugins = new \IPS\core\modules\front\system\plugins;
			$metaDesc = $plugins->hideLinkAndCode( \IPS\Output::i()->metaTags['description'], false );
			\IPS\Output::i()->metaTags['description'] = $metaDesc;
			\IPS\Output::i()->metaTags['og:description'] = $metaDesc;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}

}
]]></hook><hook type="C" class="\IPS\Text\Parser" filename="Parser"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook2110 extends _HOOK_CLASS_
{
	protected function getAllowedCssClasses()
	{
		try
		{
			$return = parent::getAllowedCssClasses();
			$return[] = 'bimHiddenBox';
			return $return;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}

}
]]></hook><hook type="C" class="\IPS\forums\Forum" filename="Forum"><![CDATA[//<?php

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	exit;
}

class hook3609 extends _HOOK_CLASS_
{
	
	public function getUnHideAction()
	{
		try
		{
			if ( \in_array( $this->id, explode(',', \IPS\Settings::i()->bim_hide_forums_like ) ) )
			{
				return "like";
			}
			elseif ( \in_array( $this->id, explode(',', \IPS\Settings::i()->bim_hide_forums_reply ) ) )
			{
				return "reply";
			}
			elseif ( \in_array( $this->id, explode(',', \IPS\Settings::i()->bim_hide_forums_both ) ) )
			{
				return "both";
			}
			
			return \IPS\Settings::i()->bim_hide_action;
		}
		catch ( \Error | \RuntimeException $e )
		{
			if ( method_exists( get_parent_class(), __FUNCTION__ ) )
			{
				return \call_user_func_array( 'parent::' . __FUNCTION__, \func_get_args() );
			}
			else
			{
				throw $e;
			}
		}
	}

}
]]></hook></hooks><settings><setting><key>bim_hide_content</key><default/></setting><setting><key>bim_hide_action</key><default/></setting><setting><key>bim_hide_gbypass</key><default/></setting><setting><key>bim_hide_forums</key><default/></setting><setting><key>bim_hide_forums_like</key><default/></setting><setting><key>bim_hide_forums_reply</key><default/></setting><setting><key>bim_hide_forums_both</key><default/></setting><setting><key>bim_hide_force_forums</key><default/></setting><setting><key>bim_hide_force_g</key><default/></setting><setting><key>bim_hide_force_forums2</key><default/></setting><setting><key>bim_hide_force_g2</key><default/></setting><setting><key>bim_hide_clubs</key><default>0</default></setting><setting><key>bim_hide_force_and</key><default>0</default></setting></settings><settingsCode><![CDATA[//<?php

$form->addHeader('bim_hide_general');
$content = array( 	'links'			=> 'bim_hide_links',
					'images'		=> 'bim_hide_images',
					'code'			=> 'bim_hide_code',
					'attachment'	=> 'bim_hide_attachment',
					'hide'			=> 'bim_hide_hide',
);
$form->add( new \IPS\Helpers\Form\CheckboxSet( 'bim_hide_content', array_filter( explode( ',', \IPS\Settings::i()->bim_hide_content ) ), FALSE, array( 'options' => $content, 'multiple' => TRUE ) ) );		

$form->add( new \IPS\Helpers\Form\Select( 'bim_hide_gbypass', \IPS\Settings::i()->bim_hide_gbypass ? explode( ',', \IPS\Settings::i()->bim_hide_gbypass ) : array(), FALSE, array( 'options' => \IPS\Member\Group::groups(), 'parse' => 'normal', 'multiple' => TRUE ) ) );

if ( \IPS\Settings::i()->bim_hide_forums == "0" )
{
	\IPS\Settings::i()->bim_hide_forums = \intval(0);
}
$form->add( new \IPS\Helpers\Form\Node( 'bim_hide_forums', isset( \IPS\Settings::i()->bim_hide_forums ) ? \IPS\Settings::i()->bim_hide_forums : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'zeroVal' => 'all' ) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'bim_hide_clubs', \IPS\Settings::i()->bim_hide_clubs, FALSE, array() ) );

$form->addHeader('bim_hide_act_header');
$options = array( 	'none'		=> 'bim_hide_act_none',
					'like'		=> 'bim_hide_act_like',
					'reply'		=> 'bim_hide_act_reply',
					'both'		=> 'bim_hide_act_both',
);
$form->add( new \IPS\Helpers\Form\Select( 'bim_hide_action', array_filter( explode( ',', \IPS\Settings::i()->bim_hide_action ) ), FALSE, array( 
	'options' 	=> $options,
	'toggles'	=> array(
		'both'	=> array( 'bim_hide_force_and' )
	),
) ) );
$form->add( new \IPS\Helpers\Form\Node( 'bim_hide_forums_like', isset( \IPS\Settings::i()->bim_hide_forums_like ) ? \IPS\Settings::i()->bim_hide_forums_like : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'clubs' => true ) ) );
$form->add( new \IPS\Helpers\Form\Node( 'bim_hide_forums_reply', isset( \IPS\Settings::i()->bim_hide_forums_reply ) ? \IPS\Settings::i()->bim_hide_forums_reply : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'clubs' => true ) ) );
$form->add( new \IPS\Helpers\Form\Node( 'bim_hide_forums_both', isset( \IPS\Settings::i()->bim_hide_forums_both ) ? \IPS\Settings::i()->bim_hide_forums_both : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'clubs' => true ) ) );
$form->add( new \IPS\Helpers\Form\YesNo( 'bim_hide_force_and', \IPS\Settings::i()->bim_hide_force_and, FALSE, array(), NULL, NULL, NULL, 'bim_hide_force_and' ) );

// $form->addHeader('bim_hide_forceHide');
// $form->add( new \IPS\Helpers\Form\Node( 'bim_hide_force_forums', isset( \IPS\Settings::i()->bim_hide_force_forums ) ? \IPS\Settings::i()->bim_hide_force_forums : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'clubs' => true ) ) );
// $form->add( new \IPS\Helpers\Form\Select( 'bim_hide_force_g', \IPS\Settings::i()->bim_hide_force_g ? explode( ',', \IPS\Settings::i()->bim_hide_force_g ) : array(), FALSE, array( 'options' => \IPS\Member\Group::groups(), 'parse' => 'normal', 'multiple' => TRUE ) ) );
// $form->add( new \IPS\Helpers\Form\Node( 'bim_hide_force_forums2', isset( \IPS\Settings::i()->bim_hide_force_forums2 ) ? \IPS\Settings::i()->bim_hide_force_forums2 : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'clubs' => true ) ) );
// $form->add( new \IPS\Helpers\Form\Select( 'bim_hide_force_g2', \IPS\Settings::i()->bim_hide_force_g2 ? explode( ',', \IPS\Settings::i()->bim_hide_force_g2 ) : array(), FALSE, array( 'options' => \IPS\Member\Group::groups(), 'parse' => 'normal', 'multiple' => TRUE ) ) );



if ( $values = $form->values() )
{
	$form->saveAsSettings();
	return TRUE;
}

return $form;]]></settingsCode><tasks/><htmlFiles><html filename="bim_hide_box.phtml">PGlwczp0ZW1wbGF0ZSBwYXJhbWV0ZXJzPSIkY29udGVudCIgLz4NCg0KPCEtLXN0YXJ0SGlkZUNvbnRlbnQtLT4NCjxkaXYgaWQ9ImJpbUhpZGRlbkJveCIgY2xhc3M9ImJpbUhpZGRlbkJveCBpcHNNZXNzYWdlIGlwc01lc3NhZ2Vfc3VjY2VzcyI+DQoJPHN0cm9uZz57bGFuZz0iYmltX2hpZGVfdGl0bGUifTwvc3Ryb25nPg0KCTx1bCBjbGFzcz0naXBzTGlzdF9pbmxpbmUnPg0KCQl7JGNvbnRlbnR8cmF3fQ0KCTwvdWw+DQo8L2Rpdj4NCjwhLS1lbmRIaWRlQ29udGVudC0tPg==</html><html filename="bim_hide_msg.phtml">PGlwczp0ZW1wbGF0ZSBwYXJhbWV0ZXJzPSIkZW1haWw9ZmFsc2UsICR0eXBlIiAvPg0KDQp7e2lmICRlbWFpbH19DQoJPGRpdiBzdHlsZT0iY29sb3I6I2ZmZmZmZjtmb250LWZhbWlseTonSGVsdmV0aWNhIE5ldWUnLGhlbHZldGljYSxzYW5zLXNlcmlmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxNHB4O2JhY2tncm91bmQ6IzNmNmQ5ODtwYWRkaW5nOjVweCAxNXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6M3B4OyI+DQoJCTxzdHJvbmc+e2xhbmc9ImJpbV9oaWRlX3RpdGxlIn08L3N0cm9uZz48YnI+DQoJCTxkaXY+DQoJCQl7e2lmIFxJUFNcU2V0dGluZ3M6OmkoKS0+YmltX2hpZGVfYWN0aW9uID09ICdyZXBseSd9fXtsYW5nPSJiaW1faGlkZV9tc2dfcmVwbHkifXt7ZWxzZX19e2xhbmc9ImJpbV9oaWRlX21zZ19saWtlIn17e2VuZGlmfX0NCgkJPC9kaXY+DQoJPC9kaXY+CQ0Ke3tlbHNlfX0NCgl7e2lmIG1lbWJlci5tZW1iZXJfaWQgPiAwfX0NCgkJPGRpdiBjbGFzcz0naXBzTWVzc2FnZSBpcHNNZXNzYWdlX2luZm8nIGlkPSdiaW1IaWRkZW5Db250ZW50UmVxdWlyZXNfe3NldHRpbmc9ImJpbV9oaWRlX2FjdGlvbiJ9Jz4NCgkJCTxwIGNsYXNzPSJpcHNUeXBlX3Jlc2V0Ij57bGFuZz0iYmltX2hpZGVfdGl0bGUifTwvcD4NCgkJCTx1bCBjbGFzcz0naXBzTGlzdF9pbmxpbmUnPg0KCQkJCXt7aWYgJHR5cGUgPT0gJ3JlcGx5J319DQoJCQkJCXtsYW5nPSJiaW1faGlkZV9tc2dfcmVwbHkifQ0KCQkJCXt7ZWxzZWlmICR0eXBlID09ICdsaWtlJ319DQoJCQkJCXtsYW5nPSJiaW1faGlkZV9tc2dfbGlrZSJ9DQoJCQkJe3tlbHNlaWYgJHR5cGUgPT0gJ2JvdGgnfX0NCgkJCQkJe2xhbmc9ImJpbV9oaWRlX21zZ19ib3RoIn0NCgkJCQl7e2VuZGlmfX0NCgkJCTwvdWw+DQoJCTwvZGl2Pg0KCXt7ZWxzZX19DQoJCTxkaXYgY2xhc3M9Imlwc0FyZWFCYWNrZ3JvdW5kIGlwc1BhZF9oYWxmIGlwc1NwYWNlcl9ib3R0b20gaXBzVHlwZV9jZW50ZXIiPg0KCQkJPGRpdiBjbGFzcz0naXBzU3BhY2VyX2JvdHRvbSBpcHNTcGFjZXJfaGFsZic+e2xhbmc9ImJpbV9oaWRlX21zZ19ndWVzdCJ9PC9kaXY+DQoJCQk8dWwgY2xhc3M9Imlwc0xpc3RfaW5saW5lIj4NCgkJCQk8bGk+DQoJCQkJCTxhIGhyZWY9J3t1cmw9ImFwcD1jb3JlJm1vZHVsZT1zeXN0ZW0mY29udHJvbGxlcj1sb2dpbiIgc2VvVGVtcGxhdGU9ImxvZ2luIn0nIGNsYXNzPSJpcHNCdXR0b24gaXBzQnV0dG9uX3ByaW1hcnkgaXBzQnV0dG9uX3ZlcnlTbWFsbCBpcHNQb3NfcmlnaHQiIGRhdGEtaXBzRGlhbG9nIGRhdGEtaXBzRGlhbG9nLXNpemU9J21lZGl1bSc+e2xhbmc9InNpZ25faW5fc2hvcnQifTwvYT4NCgkJCQk8L2xpPg0KCQkJCTxsaT57bGFuZz0ib3IifTwvbGk+DQoJCQkJPGxpPg0KCQkJCQk8YSBocmVmPSd7dXJsPSJhcHA9Y29yZSZtb2R1bGU9c3lzdGVtJmNvbnRyb2xsZXI9cmVnaXN0ZXIiIHNlb1RlbXBsYXRlPSJyZWdpc3RlciJ9JyBjbGFzcz0iaXBzQnV0dG9uIGlwc0J1dHRvbl9wcmltYXJ5IGlwc0J1dHRvbl92ZXJ5U21hbGwgaXBzUG9zX3JpZ2h0IiBkYXRhLWlwc0RpYWxvZyBkYXRhLWlwc0RpYWxvZy1zaXplPSdtZWRpdW0nPntsYW5nPSJzaWduX3VwIn08L2E+DQoJCQkJPC9saT4NCgkJCTwvdWw+CQkNCgkJPC9kaXY+CQ0KCXt7ZW5kaWZ9fQ0Ke3tlbmRpZn19</html></htmlFiles><cssFiles><css filename="bimHideContent.css">LmJpbUhpZGRlbkJveCB7DQoJYmFja2dyb3VuZDogI2Y1ZmZmNCAhaW1wb3J0YW50Ow0KCWJvcmRlcjogMXB4IHNvbGlkICNkY2ZjZDk7DQoJY29sb3I6ICMwMDAgIWltcG9ydGFudDsNCn0NCg0KLmlwc1F1b3RlIC5iaW1IaWRkZW5Cb3ggew0KCWRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCn0=</css></cssFiles><jsFiles><js filename="hideContent.js">OyggZnVuY3Rpb24oJCwgXywgdW5kZWZpbmVkKXsNCgkidXNlIHN0cmljdCI7DQoJDQoJaXBzLmNvbnRyb2xsZXIubWl4aW4oJ2JpbUhpZGVDb250ZW50TGlrZScsICdjb3JlLmZyb250LmNvcmUucmVhY3Rpb24nLCB0cnVlLCBmdW5jdGlvbiAoKSANCgl7CQ0KCQl0aGlzLmFmdGVyKCdjbGlja1JlYWN0aW9uJywgZnVuY3Rpb24gKGUpIHsNCgkJCXRoaXMudXBkYXRlUG9zdENvbnRlbnQoZSk7DQoJCX0pOw0KCQkNCgkJdGhpcy5hZnRlcigndW5yZWFjdCcsIGZ1bmN0aW9uIChlKSB7DQoJCQl0aGlzLnVwZGF0ZVBvc3RDb250ZW50KGUpOw0KCQl9KTsJCQkNCgkJDQoJCXRoaXMudXBkYXRlUG9zdENvbnRlbnQgPSBmdW5jdGlvbiAoZSkgew0KDQoJCQlpZiAoICQoIGUuY3VycmVudFRhcmdldCApLmNsb3Nlc3QoJy5iaW1Ub3BpY0ZlZWQnKS5sZW5ndGggPiAwICkgew0KCQkJCXZhciB1bmhpZGVBY3QgPSAkKCBlLmN1cnJlbnRUYXJnZXQgKS5jbG9zZXN0KCcuaXBzU3RyZWFtSXRlbV9jb250YWluZXInKS5maW5kKCcuYmltVW5oaWRlQWN0JykuZmlyc3QoKS50ZXh0KCk7DQoJCQl9DQoJCQllbHNlIHsNCgkJCQl2YXIgdW5oaWRlQWN0ID0gaXBzLmdldFNldHRpbmcoJ3VuaGlkZUFjdGlvbicpOw0KCQkJfQ0KDQoJCQlpZiAoIHVuaGlkZUFjdCA9PSAibGlrZSIgfHwgdW5oaWRlQWN0ID09ICJib3RoIiApDQoJCQl7CQkNCgkJCQl2YXIgaWQgPSAkKCBlLmN1cnJlbnRUYXJnZXQgKS5jbG9zZXN0KCcuaXBzQ29tbWVudF9jb250ZW50JykuYXR0cignZGF0YS1jb21tZW50aWQnKTsNCg0KCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgew0KCQkJCQlpcHMuZ2V0QWpheCgpKCBpcHMuZ2V0U2V0dGluZygnYmFzZVVSTCcpICsgIj9hcHA9Y29yZSZtb2R1bGU9c3lzdGVtJmNvbnRyb2xsZXI9cGx1Z2lucyZkbz1iaW1WaWV3Q29udGVudCIsIHsNCgkJCQkJCXR5cGU6ICdwb3N0JywNCgkJCQkJCWRhdGFUeXBlOiAnanNvbicsDQoJCQkJCQlkYXRhOiB7IGlkOiBpZCB9DQoJCQkJCX0pDQoJCQkJCQkuZG9uZSggZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQoJCQkJCQkJaWYgKCByZXNwb25zZS50eXBlID09ICdlcnJvcicgKSB7DQoJCQkJCQkJCWlwcy51aS5hbGVydC5zaG93KCB7IG1lc3NhZ2U6IHJlc3BvbnNlLm1lc3NhZ2UgfSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWVsc2UgaWYgKCByZXNwb25zZS50eXBlID09ICdPSycgKSB7DQoJCQkJCQkJCXZhciBjbXRXcmFwcGVyID0gJCgnI2NvbW1lbnQtJyArIGlkICsgJ193cmFwJykuZmluZCgnW2RhdGEtcm9sZT0iY29tbWVudENvbnRlbnQiXScpOw0KCQkJCQkJCQljbXRXcmFwcGVyLmh0bWwoIHJlc3BvbnNlLmNvbnRlbnQgKS5oaWRlKCkuZmFkZUluKCk7DQoJCQkJCQkJCQ0KCQkJCQkJCQkkKCBkb2N1bWVudCApLnRyaWdnZXIoICdjb250ZW50Q2hhbmdlJywgWyBjbXRXcmFwcGVyIF0gKTsNCgkJCQkJCQkJDQoJCQkJCQkJCWNtdFdyYXBwZXIudHJpZ2dlcigncmVmcmVzaENvbnRlbnQnKTsNCgkJCQkJCQkJDQoJCQkJCQkJCWlwcy51dGlscy5sYXp5TG9hZC5sb2FkQ29udGVudCggY210V3JhcHBlciApOw0KCQkJCQkJCQkNCgkJCQkJCQkJaWYgKCBpcHMuZ2V0U2V0dGluZygnYmltX2dhbF9oZWlnaHQnKSApIHsNCgkJCQkJCQkJCXZhciBnYWwgPSBjbXRXcmFwcGVyLmZpbmQoJ2RpdltjbGFzcz1nYWxsZXJpYV0nKTsNCgkJCQkJCQkJCWJpbWdhbGxlcnkuaW5pdEdhbGxlcnkoZ2FsKTsJCQkJCQkJCQ0KCQkJCQkJCQl9DQoJCQkJCQkJCQ0KCQkJCQkJCQkkKGRvY3VtZW50KS50cmlnZ2VyKCd1cGRhdGVIaWRlQ29udGVudCcpOwkJCQkJCQkJDQoJCQkJCQkJfQ0KCQkJCQkJfSk7DQoJCQkJfSwgMTAwMCk7DQoJCQl9CQkJDQoJCX0NCgl9KTsNCgkNCglpcHMuY29udHJvbGxlci5taXhpbignYmltSGlkZUNvbnRlbnRFZGl0b3InLCAnY29yZS5mcm9udC5jb3JlLmNvbW1lbnRGZWVkJywgdHJ1ZSwgZnVuY3Rpb24gKCkgDQoJew0KCQlpZiAoIGlwcy5nZXRTZXR0aW5nKCd1bmhpZGVBY3Rpb24nKSApIHsNCgkJCXZhciB1bmhpZGVBY3QgPSBpcHMuZ2V0U2V0dGluZygndW5oaWRlQWN0aW9uJyk7DQoJCX0NCg0KCQlpZiAoIHVuaGlkZUFjdCA9PSAicmVwbHkiIHx8IHVuaGlkZUFjdCA9PSAiYm90aCIgKQ0KCQl7DQoJCQl0aGlzLmJlZm9yZSgncXVpY2tSZXBseScsIGZ1bmN0aW9uIChlKSB7DQoJCQkJaWYgKCAkKCcjYmltSGlkZGVuQ29udGVudFJlcXVpcmVzX3JlcGx5JykubGVuZ3RoIHx8ICQoJyNiaW1IaWRkZW5Db250ZW50UmVxdWlyZXNfYm90aCcpLmxlbmd0aCApDQoJCQkJew0KCQkJCQl0aGlzLnNjb3BlLmZpbmQoJ1tkYXRhLXJvbGU9InJlcGx5QXJlYSJdIGZvcm0nKS5hdHRyKCdkYXRhLW5vQWpheCcsICd0cnVlJyk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0JDQoJfSk7DQoNCn0oalF1ZXJ5LCBfKSk7</js></jsFiles><resourcesFiles/><lang><word key="bim_hide_title" js="0">Hidden Content</word><word key="bim_hide_msg_like" js="0">Give reaction to this post to see the hidden content.</word><word key="bim_hide_msg_reply" js="0">Reply to this topic to see the hidden content.</word><word key="bim_hide_msg_both" js="0">Give reaction or reply to this topic to see the hidden content.</word><word key="bim_hide_gbypass" js="0">Groups will be able to bypass</word><word key="bim_hide_gbypass_desc" js="0">Select which groups will always see the hidden content.</word><word key="bim_hide_links" js="0">External links</word><word key="bim_hide_images" js="0">Images</word><word key="bim_hide_code" js="0">Code</word><word key="bim_hide_content" js="0">Hide</word><word key="bim_hide_attachment" js="0">Attachments</word><word key="bim_hide_action" js="0">For all selected Forums</word><word key="bim_hide_act_like" js="0">Reaction</word><word key="bim_hide_act_reply" js="0">Reply</word><word key="bim_hide_act_none" js="0">Not show</word><word key="bim_hide_hideInSearch" js="0">[Hidden Content]</word><word key="bim_hide_forums" js="0">Hide content in forums</word><word key="bim_hide_hide" js="0">[hide]...[/hide]</word><word key="bim_hide_act_both" js="0">Reaction or Reply</word><word key="bim_hide_general" js="0">General</word><word key="bim_hide_act_header" js="0">Action to unhide</word><word key="bim_hide_forums_like" js="0">Forums use 'reaction'</word><word key="bim_hide_forums_reply" js="0">Forums use 'reply'</word><word key="bim_hide_forums_both" js="0">Forums use 'reaction or reply'</word><word key="bim_hide_forceHide" js="0">Always hide content</word><word key="bim_hide_force_forums" js="0">Always hide in forums #1</word><word key="bim_hide_force_g" js="0">And for groups #1</word><word key="bim_hide_force_forums2" js="0">Always hide in forums #2</word><word key="bim_hide_force_g2" js="0">And for groups #2</word><word key="bim_hide_error_email" js="0">This topic has hidden content so you can not share it in email until you unhide the content.</word><word key="bim_hide_clubs" js="0">Hide content in Clubs</word><word key="bim_hide_force_and" js="0">Requires reaction AND reply instead of 'OR'</word><word key="bim_hide_msg_guest" js="0">This is the hidden content, please</word><word key="bim_hide_content_btn" js="1">Hide content</word><word key="bim_hide_content_content" js="1">Content</word><word key="bim_hide_content_err_empty_content" js="1">This field can not be empty</word></lang><versions><version long="10000" human="1.0.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * Install Code
 */
class ips_plugins_setup_install
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10001" human="1.0.1"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.1 Upgrade Code
 */
class ips_plugins_setup_upg_10001
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10002" human="1.0.2"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.2 Upgrade Code
 */
class ips_plugins_setup_upg_10002
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10003" human="1.0.3"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.3 Upgrade Code
 */
class ips_plugins_setup_upg_10003
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10004" human="1.0.4"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.4 Upgrade Code
 */
class ips_plugins_setup_upg_10004
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10005" human="1.0.5"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.5 Upgrade Code
 */
class ips_plugins_setup_upg_10005
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10006" human="1.0.6"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.6 Upgrade Code
 */
class ips_plugins_setup_upg_10006
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10007" human="1.0.7"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.7 Upgrade Code
 */
class ips_plugins_setup_upg_10007
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="10008" human="1.0.8"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.0.8 Upgrade Code
 */
class ips_plugins_setup_upg_10008
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="11000" human="1.1.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 1.1.0 Upgrade Code
 */
class ips_plugins_setup_upg_11000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200000" human="2.0.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.0 Upgrade Code
 */
class ips_plugins_setup_upg_200000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200001" human="2.0.1"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.1 Upgrade Code
 */
class ips_plugins_setup_upg_200001
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200002" human="2.0.2"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.2 Upgrade Code
 */
class ips_plugins_setup_upg_200002
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200003" human="2.0.3"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.3 Upgrade Code
 */
class ips_plugins_setup_upg_200003
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200004" human="2.0.4"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.4 Upgrade Code
 */
class ips_plugins_setup_upg_200004
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200005" human="2.0.5"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.5 Upgrade Code
 */
class ips_plugins_setup_upg_200005
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="200006" human="2.0.6"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.0.6 Upgrade Code
 */
class ips_plugins_setup_upg_200006
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="300000" human="3.0.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.0.0 Upgrade Code
 */
class ips_plugins_setup_upg_300000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="300001" human="3.0.1"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.0.1 Upgrade Code
 */
class ips_plugins_setup_upg_300001
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="300002" human="3.0.2"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.0.2 Upgrade Code
 */
class ips_plugins_setup_upg_300002
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="300003" human="3.0.3"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.0.3 Upgrade Code
 */
class ips_plugins_setup_upg_300003
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="300004" human="3.0.4"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.0.4 Upgrade Code
 */
class ips_plugins_setup_upg_300004
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="300005" human="3.0.5"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.0.5 Upgrade Code
 */
class ips_plugins_setup_upg_300005
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="310000" human="3.1.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.1.0 Upgrade Code
 */
class ips_plugins_setup_upg_310000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="310001" human="3.1.1"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.1.1 Upgrade Code
 */
class ips_plugins_setup_upg_310001
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="310002" human="3.1.2"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.1.2 Upgrade Code
 */
class ips_plugins_setup_upg_310002
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="310003" human="3.1.3"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.1.3 Upgrade Code
 */
class ips_plugins_setup_upg_310003
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="310004" human="3.1.4"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.1.4 Upgrade Code
 */
class ips_plugins_setup_upg_310004
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="320000" human="3.2.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.2.0 Upgrade Code
 */
class ips_plugins_setup_upg_320000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="320001" human="3.2.1"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.2.1 Upgrade Code
 */
class ips_plugins_setup_upg_320001
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="320002" human="3.2.2"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.2.2 Upgrade Code
 */
class ips_plugins_setup_upg_320002
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="330000" human="3.3.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.3.0 Upgrade Code
 */
class ips_plugins_setup_upg_330000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="330001" human="3.3.1"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.3.1 Upgrade Code
 */
class ips_plugins_setup_upg_330001
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="330002" human="3.3.2"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.3.2 Upgrade Code
 */
class ips_plugins_setup_upg_330002
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version><version long="330003" human="3.3.3"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 3.3.3 Upgrade Code
 */
class ips_plugins_setup_upg_330003
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version></versions></plugin>
